在Kotlin中,有一些情况下编译器会抱怨一个泛型类型参数定义为<T>并期望<T : Any>。这两者有什么区别呢?
<T>
<T : Any>
null
Any?
<T: Any>
T
因此,<T>是隐式的<T: Any?>。
<T: Any?>
Null
Any
Java
Object
<T : Any?>
java.lang.Object
T
是否隐式地可为空(Nullable)。Null
也不是扩展了Any
类吗? - Harshvardhan JoshiJava
中的Object
相同。 - Harshvardhan JoshiObject
是相同的,因为Object
对应于Any?
而不是Any
。与Java不同,“Kotlin支持可空类型”的说法是不正确的。它支持的是非空类型。 - Marko Topolnik<T>
表示可为空并不正确。它意味着它可以是可空的或非空的。 - Marko Topolnik<T>
与<T : Any?>
是相同的。Any
是可空类型Any?
的非空子类型,而<T : Any>
将T
限制为非空类型。根据上下文,Any
和Any?
都可以映射到java.lang.Object
;Kotlin的类型系统比Java更细粒度。 - gidds