问题描述
我在科特林遇到了这个问题
我有一个可变的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?