en kotlin, cómo devolver un MutableList donde el destino espera una list

tener un hashMap con List como valor definido:

private var mMap: HashMap<String, List<DataStatus>>? = null 

tener una function devolver un hashMap pero con el valor de MutableList

  fun getDataStatus(response: JSONObject?): HashMap<String, MutableList<DataStatus>> { return HashMap<String, MutableList<AccountStatusAlert>>() } 

cuando pasa el resultado a la list de espera de hashMap, obtiene el error:

  mMap = getDataStatus(resp) //<== got error 

tiene error:

 Error:(81, 35) Type mismatch: infernetworking type is HashMap<String, MutableList<DataStatus>> but HashMap<String, List<DataStatus>>? was expected 

Tienes dos soluciones según tus necesidades.

Echarlo

Teniendo en count que MutableList es una subclass de List , puedes convertirlo. Aquí solo hay un problema: perderás la inmutabilidad. Si devuelve la List a MutableList , puede modificar su contenido.

 mMap = getDataStatus(repo) as HashMap<String, List<String>> 

Convertirlo

Para mantener la inmutabilidad en la list, debe convertir cada MutableList en una List inmutable:

 mMap = HashMap<String, List<String>>() getDataStatus(repo).forEach { (s, list) -> mMap?.put(s, list.toList()) } 

En este caso, si intenta modificar el contenido de una list dentro de mMap , se mMap una exception.

Si no planea colocar nuevos elementos en el map una vez que se lo devolvieron, simplemente declare que su variable tiene un tipo más permisivo:

 // prohibits calling members that take List<DataStatus> as a parameter, // so you can store a HashMap with values of any List subtype, // for example of MutableList private var mMap: HashMap<String, out List<DataStatus>>? = null 

o

 // prohibits calling mutating methods // List<DataStatus> already has 'out' variance private var mMap: Map<String, List<DataStatus>>? = null 

Si por alguna razón necesita que esa variable tenga exactamente ese tipo, entonces necesita convertir o actualizar valores en el map devuelto:

 mMap = getDataStatus(resp).mapValuesTo(HashMap()) { (_, v) -> v as List<DataStatus> } 

Una gran solución es:

 private var mMap: Map<String, List<DataStatus>>? = null // Do you //really need to have object with interface of HashMap? I don't think so.. mMap = getDataStatus(resp).mapValues { it.value.toList() } // add as HashMap<String, List<DataStatus>> if you really need //HashMap interface 

Por lo tanto, no se recomienda el uso de var + types anulables cuando se usa Kotlin. Quizás quieras seguir:

 val mMap = mutableMapOf<String, List<DataStatus>() 

o inmediatamente:

 val mMap = getDataStatus(resp).mapValues { it.value.toList() }