Java 通配符类型与 Kotlin 星投影

Java Wildcard-types vs Kotlin Star-projection

我在这里阅读了关于 Java 和 Kotlin 之间差异的 kotlin 文档 https://kotlinlang.org/docs/reference/comparison-to-java.html。那里说 Kotlin 没有通配符类型。但是,在仔细阅读泛型文档后,我发现了有关的信息 star-projection 老实说,我看不出有什么不同。有人可以给我解释一下吗

List<?> list;

与此不同

lateinit var list: MutableList<*> 

可能这意味着 Kotlin 没有与 Java 中相同形式的通配符。相反,Kotlin 使用 mixed-site variance 的不同概念,它添加了一个选项来指定声明站点的方差,这是使用 Java 通配符无法做到的。

至于星投影,其实几乎等同于无界的Java通配符。但是,至少有一处与 Kotlin 类型系统有关的差异。

当你有 List<?> 时,Java 不知道类型,但所有 Java 引用类型都可以为空,因此你可以安全地传递 null作为未知类型的参数,例如list.add(null).

在 Kotlin 中这不是真的,一个星形投影 MutableList<*> 结合了 out Any?in Nothing 投影,后者意味着你不能将任何东西传递给其中的方法类型未知(Nothing 是没有值的类型)。

外投影也是如此:虽然您可以将 null 作为 Java 有界通配符类型 ? extends T 传递,但您不能对 Kotlin out T 投影.

Java 无限通配符的确切等价物是 <in Nothing?>,因为它允许您将 null 作为未知类型的参数传递(Nothing?Nothing ∪ { null }, 这是只有 null 值的类型).