为什么在 Kotlin 中可以从控制列表中读取



我在 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?

相关内容

  • 没有找到相关文章

最新更新