我在 Kotlin 中遇到了这个问题 我有一个 Int 类型的可变列表,据说仅用于编写, 但是,它允许我从中阅读
{
val listOfInt: MutableList<in Int> = mutableListOf<Number>(1.3434, 4.432)
println(listOfInt[0])
1.3434
}
虽然它不会让我简单地创建而不指定仅用于编写
{
val listOfInt: MutableList<Int> = mutableListOf<Number>(1.3434, 4.432)
}
至于逆变,你不应该能够从中获得任何数据。 这是一个错误还是一个功能?
谢谢
逆变不会阻止你阅读。它只会阻止编译器了解有关检索项类型的任何特定信息,因此编译器将它们视为始终安全且不需要强制转换的Any?
。另一方面,协方差确实会完全阻止您写入列表,因为如果您不知道特定的允许类型绑定,那么将任何内容放入列表中都是安全的。
试试这个:
val list:MutableList<in Int> = mutableListOf(1)
val x:Int = list[0] //Error
不同的是,println
需要Any?
给定一个MutableList<in Int>
,指定的类型仅适用于您放入其中的内容。 它们必须是Int
类或子类。 它不适用于你从中得到的东西,所以它们是Any?
的。 不过,所有读取事物的方法仍然存在。
当您声明类时,您正在考虑的限制会显示:
class A<in T>
{
fun getIt() : T? = null //Error
}
编译器在这里抱怨,因为我说我想返回指定类型的值。 我的请求毫无意义,因为任何尝试使用该方法的人都会得到Any?