Kotlin - <T> 与 <T : Any> 的区别

29

在Kotlin中,有一些情况下编译器会抱怨一个泛型类型参数定义为<T>并期望<T : Any>。这两者有什么区别呢?

1个回答

50
区别在于普通的<T>表示它可以是null(使用Any?表示)。而<T: Any>将限制T为非空类型。

因此,<T>是隐式的<T: Any?>


1
我只是好奇 T 是否隐式地可为空(Nullable)。Null 也不是扩展了 Any 类吗? - Harshvardhan Joshi
1
谢谢。我找不到这方面的参考资料。因此,我一直认为它与Java中的Object相同。 - Harshvardhan Joshi
4
它与Object是相同的,因为Object对应于Any?而不是Any。与Java不同,“Kotlin支持可空类型”的说法是不正确的。它支持的是非空类型。 - Marko Topolnik
3
我想强调的是,说 <T> 表示可为空并不正确。它意味着它可以是可空的或非空的。 - Marko Topolnik
4
实际上,<T><T : Any?>是相同的。Any是可空类型Any?的非空子类型,而<T : Any>T限制为非空类型。根据上下文,AnyAny?都可以映射到java.lang.Object;Kotlin的类型系统比Java更细粒度。 - gidds
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接