在kotlin中,如何传回目的地期望List的MutableList

时间:2017-10-09 15:33:02

标签: android list inheritance kotlin

将hashMap与List定义为值:

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

让函数返回一个hashMap,但值为MutableList

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

          return HashMap<String, MutableList<AccountStatusAlert>>()
     }

当将结果传递给期望List的hashMap时,它得到了错误:

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

得到错误:

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

3 个答案:

答案 0 :(得分:6)

根据您的需要,您有两种解决方案。

施展

考虑到MutableListList的子类,您可以将其强制转换。这里只有一个问题:你将失去不变性。如果您将List转发回MutableList,则可以修改其内容。

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

转换

为了保持列表的不变性,您必须将每个MutableList转换为不可变List

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

在这种情况下,如果您尝试修改mMap内的列表内容,则会抛出异常。

答案 1 :(得分:1)

如果您不打算在将新项目返回给您后将其放入地图中,只需声明您的变量具有更宽松的类型:

// 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

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

如果由于某种原因需要该变量具有该类型,那么您需要在返回的映射中转换或转发值:

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

答案 2 :(得分:0)

一个很好的解决方案是:

<head>

因此,使用Kotlin时不建议使用var + nullable类型。也许你想要跟随:

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

或立即:

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