为什么在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?