1

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

}

至于逆变,您不应该能够从中获取任何数据。这是一个错误还是一个功能?

谢谢

4

2 回答 2

1

逆变并不妨碍你阅读。它只会阻止编译器知道有关检索项目类型的任何具体信息,因此编译器将它们视为Any?始终安全且不需要强制转换的方式。另一方面,协方差确实完全阻止您写入列表,因为如果您不知道特定的允许类型绑定,那么将任何内容放入列表中都是安全的。

于 2020-09-23T12:26:02.167 回答
0

尝试这个:

val list:MutableList<in Int> = mutableListOf(1)
val x:Int = list[0]  //Error

不同之处在于println需要一个Any?

给定 a MutableList<in Int>指定的类型仅适用于您放入其中的内容。它们必须是Int或子类。它不适用于你从中得到的东西,所以它们是Any?。但是,所有读取内容的方法仍然存在。

当您声明一个类时,您正在考虑的限制会出现:

class A<in T>
{
    fun getIt() : T? = null  //Error
}

这里编译器抱怨,因为我说我想返回一个指定类型的值。我的请求毫无意义,因为任何尝试使用该方法的人都会得到Any?

于 2020-09-23T12:19:08.657 回答