Java 通配符类型 vs Kotlin Star-projection

2022-09-03 13:29:58

我在这里阅读了一个关于Java和Kotlin之间差异的kotlin文档,https://kotlinlang.org/docs/reference/comparison-to-java.html。那里说 Kotlin 没有通配符类型。然而,在仔细阅读泛型的文档后,我发现了有关恒星投影的信息,老实说,我看不出区别。有人可以向我解释一下这是怎么回事吗?

List<?> list;

与此不同

lateinit var list: MutableList<*> 

答案 1

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

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

当您有 时,Java 对该类型是未知的,但所有 Java 引用类型都是可空的,因此您可以安全地将 a 作为未知类型的参数传递,例如 .List<?>nulllist.add(null)

在 Kotlin 中,这不是真的,星形投影将两者和投影组合在一起,后者意味着您根本无法将任何内容传递给类型未知的方法(即没有值的类型)。MutableList<*>out Any?in NothingNothing

外投影也是如此:虽然您可以将 a 作为 Java 有界通配符类型传递,但不能对 Kotlin 投影执行相同的操作。null? extends Tout T

Java无界通配符的完全等效是,因为它允许您将a作为未知类型的参数传递(∪{},这是只有值的类型)。<in Nothing?>nullNothing?Nothingnullnull


答案 2

推荐