类型不匹配:推断的类型是V?但预期Collection <Nothing>

时间:2019-07-14 15:03:44

标签: generics kotlin

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中定义的布尔值

有没有办法解决这个问题?

1 个答案:

答案 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?的子类型,如果您未指定上限,因为这是最“通用”类型)。