首页 > 解决方案 > 类型不匹配:推断类型是 V?但收藏预计

问题描述

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<*> 限制使用 public abstract fun addAll(elements: Collection): Boolean 定义在 kotlin.collections.MutableCollection

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

标签: genericskotlin

解决方案


这是具有不变类型的星形投影的预期行为T,如MutableCollection<T>. 从文档中:

对于 Foo<T : TUpper>,其中 T 是具有上限 TUpper 的不变类型参数,Foo<*> 等效于 Foo<out TUpper> 读取值和 Foo<in Nothing> 写入值。

为什么会这样?在 Java 中,当您拥有 a 时,List<?>您始终可以插入null,因为所有类型都可以为空,但在 Kotlin 中并非如此,这就是为什么您不能向MutableList<*>. 同样,您从 Java 中提取的任何内容都List<?>将始终是的子类型Object(因为每个非原始类型都 extends Object)。在 Kotlin 中,您知道从 a 中提取的任何内容都MutableList<*>将始终是TUpper(或者Any?,如果您未指定上限,因为这是可用的最“通用”类型)的子类型。


推荐阅读