Java通配符类型与Kotlin星投影
我正在阅读一篇关于Java和kotlin之间差异的kotlin文档 . 据说,Kotlin没有通配符类型。然而,在仔细阅读了泛型文档之后,我发现了关于 老实说,我看不出有什么区别。有人能解释一下这是怎么回事吗Java通配符类型与Kotlin星投影,java,generics,kotlin,wildcard,Java,Generics,Kotlin,Wildcard,我正在阅读一篇关于Java和kotlin之间差异的kotlin文档 . 据说,Kotlin没有通配符类型。然而,在仔细阅读了泛型文档之后,我发现了关于 老实说,我看不出有什么区别。有人能解释一下这是怎么回事吗 List<?> list; 列表; 与此不同 lateinit var list: MutableList<*> lateinit变量列表:可变列表 这可能意味着Kotlin的通配符与Java中的通配符形式不同。相反,Kotlin使用了一个不同的概念,它添加
List<?> list;
列表;
与此不同
lateinit var list: MutableList<*>
lateinit变量列表:可变列表
这可能意味着Kotlin的通配符与Java中的通配符形式不同。相反,Kotlin使用了一个不同的概念,它添加了一个选项来指定声明站点的差异,这是Java通配符无法做到的
至于星投影,它实际上几乎相当于一个无界Java通配符。然而,至少有一个与Kotlin类型系统相关的差异
当您有一个列表时,Java不知道该类型,但所有Java引用类型都可以为null,因此您可以安全地将null
作为未知类型的参数传递,例如List.add(null)
在Kotlin中,这是不正确的,星形投影MutableList
将out Any?
和In Nothing
投影组合在一起,后者意味着您根本无法向类型未知的方法传递任何内容(Nothing
是没有值的类型)
out投影也是如此:虽然可以将null
作为Java绑定的通配符类型传递?扩展T
,您不能对Kotlinout T
投影执行相同的操作
Java无界通配符的确切等价物是
,因为它允许您将null
作为未知类型的参数传递(Nothing?
isNothing
∪ {null
},这是只有null
值的类型)