generics - 类型不匹配:推断类型是 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
有没有办法来解决这个问题?
解决方案
这是具有不变类型的星形投影的预期行为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?
,如果您未指定上限,因为这是可用的最“通用”类型)的子类型。
推荐阅读
- asp.net-core - 更新 CosmosDB 中的类型化对象
- xamarin - 在 Xamarin.Forms 中设计和打印 PDF
- angular - 离子使用角度 HTTP POST 不会调用 Android 模拟器上的 API
- c# - WebBrowser 控件抛出大量 JavaScript 错误
- jquery - 无法遍历从 AJAX 请求返回的 JSON
- python - Python 检查几个 if 条件(用数字查找和替换单词)
- python - 在 python 中解析此文本的最佳/更清洁的方法是什么?
- sql-server - Create an Alert in SQL if a field in a table decreases (Seq number Control Table)
- kotlin - 为什么在获取 JSON 时会出现 NullPointerException?
- linux - IIS 中的子站点映射