Java Wildcard-types与Kotlin Star-projection

pok*_*zok 8 java generics wildcard kotlin

我正在阅读有关Java和Kotlin之间差异的kotlin文档,请访问 https://kotlinlang.org/docs/reference/comparison-to-java.html.据说那里Kotlin没有通配符类型.然而,在仔细阅读了仿制药的文档后,我发现了关于 星形投影的信息,老实说,我看不出差异.有人可以向我解释这是怎么回事

List<?> list;
Run Code Online (Sandbox Code Playgroud)

与此不同

lateinit var list: MutableList<*> 
Run Code Online (Sandbox Code Playgroud)

hot*_*key 13

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

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

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

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

对于out-projection也可以这样说:虽然你可以传递null一个Java有界通配符类型? extends T,但你不能对Kotlin out T投影做同样的事情.

和Java无界通配符的完全等效的<in Nothing?>,因为它可以让你传递一个null作为未知类型的参数(Nothing?Nothing∪{ null},这是一个只具有类型null值).