Java通配符类型与Kotlin Star-projection

我正在阅读关于Java和Koltin之间差异的kotlin文档,在这里https://kotlinlang.org/docs/reference/comparison-to-java.html 。 有人指出, Koltin没有通配符类型 。 但仔细阅读泛型文档后,我发现了有关星形投影的信息 ,老实说,我看不出有什么不同。 有人可以向我解释这是怎么回事

List<?> list; 

不同于此

 lateinit var list: MutableList<*> 

也许这意味着Kotlin没有像在Java中一样的通配符。 相反,Kotlin使用了混合站点差异的不同概念,它增加了一个选项来指定声明站点的差异,这是用Java通配符无法做到的。

至于星型投影,它实际上几乎相当于一个无界的Java通配符。 但是,至少有一个与Kotlin类型系统有关的差异。

当你有一个List<?> ,这个类型对于Java来说是未知的,但是所有的Java引用类型都是可空的,因此你可以安全的传递一个null作为未知类型的参数,例如list.add(null)

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

out-projections也可以这样说:虽然可以将null作为Java有界的通配符类型传递? extends T ? extends T ,你不能用Kotlin out T做同样的投影。

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