fun someMethod(v: Any) {
val fieldValue = get(Any())
if (fieldValue != null && fieldValue is MutableCollection<*> && v is Collection<*>) {
fieldValue.addAll(v)
}
}
fun get(obj: Any): Any? {
TODO()
}
上面的代码返回以下错误:
错误:(115,39)Kotlin:类型不匹配:推断类型为V?但 期望收集。投影类型MutableCollection <*> 限制使用公共抽象乐趣addAll(elements:Collection): 在kotlin.collections.MutableCollection中定义的布尔值
有没有办法解决这个问题?
答案 0 :(得分:2)
这是恒星类型为T
的恒星投影的预期行为,如MutableCollection<T>
中所示。来自documentation:
对于Foo
,其中T是上限类型为TUpper的不变类型参数,Foo <*>等同于Foo 用于读取值,而Foo 则用于写入值。
为什么会这样?
在Java中,当您拥有List<?>
时,您可以始终插入null
,因为所有类型都可以为空,但是Kotlin并非如此,这就是为什么您不能向MutableList<*>
添加任何内容的原因。同样,从Java List<?>
提取的任何内容将始终是Object
的子类型(因为每个非基本类型都扩展了Object
)。在Kotlin中,您知道从MutableList<*>
提取的任何内容始终都是TUpper
的子类型(或Any?
的子类型,如果您未指定上限,因为这是最“通用”类型)。