Java通配符类型 vs Kotlin星号投影

16
我在阅读有关Java和Kotlin之间差异的Kotlin文档,链接在此处:https://kotlinlang.org/docs/reference/comparison-to-java.html。文中指出了Kotlin没有通配符类型。然而,在仔细阅读泛型文档后,我发现了关于星号投影的信息,但是老实说我看不出有什么区别。有人可以解释一下吗?
List<?> list;

与此不同

lateinit var list: MutableList<*> 
1个回答

24
可能意味着Kotlin没有像Java中那样的通配符。相反,Kotlin使用了一种不同的mixed-site variance概念,它增加了在声明时指定方差的选项,这是Java通配符无法做到的。
至于星号投影,它实际上几乎等同于未限定的Java通配符。然而,与Kotlin类型系统相关的至少有一个区别。
当你有一个List<?>时,Java不知道类型,但所有Java引用类型都是可为空的,因此你可以安全地将null作为未知类型的参数传递,例如list.add(null)
在Kotlin中不是这样的,星号投影MutableList<*>结合了out Any?in Nothing投影,后者意味着您无法向类型未知的方法中传递任何内容(Nothing是没有值的类型)。
对于out-projections也可以说同样的话:虽然你可以将Java有界通配符类型? extends T作为null传递,但你不能用Kotlin的out T投影做同样的事情。
Java的无限制通配符的确切等价物是<in Nothing?>,因为它允许您将null作为未知类型的参数传递(Nothing?Nothing ∪ {null},这是只有null值的类型)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接