将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
答案 0 :(得分:6)
根据您的需要,您有两种解决方案。
施展
考虑到MutableList
是List
的子类,您可以将其强制转换。这里只有一个问题:你将失去不变性。如果您将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>()