Kotlin泛型中“ *”和“ Any”之间的区别


106

我不知道我完全理解之间的差异SomeGeneric<*>SomeGeneric<Any>。我认为*代表任何东西(通配符)并Any代表所有对象继承的对象。所以看起来它们应该相同,但是对吗?

Answers:


158

星形投影视为不仅代表任何类型,而且代表某些您不知道确切类型的固定类型的方法可能会有所帮助。

例如,类型MutableList<*>表示某物的列表(您不知道到底是什么)。因此,如果您尝试向此列表添加内容,则不会成功。它可以是的列表,也可以是的列表String,或Int其他内容的列表。编译器根本不允许在该列表中放置任何对象,因为它无法验证列表是否接受此类型的对象。但是,如果您尝试从此类列表中删除元素,则肯定会得到类型的对象Any?,因为Kotlin中的所有对象都继承自Any

从下面的asco评论:

另外List<*>,它可以包含任何类型的对象,但只能包含该类型的对象,因此它可以包含Strings(但只能包含Strings),而List<Any> 可以包含Strings和Integers之类的东西,所有这些都在同一列表中。


83
好的答案,对于某些人来说,添加List <*>可以包含任何类型的对象可能是有帮助的,但是只能包含该类型,因此它可以包含Strings(但只能包含Strings),而List <Any>可以包含Strings和Integers以及什么,都在同一列表中。
fweigl

1
:这里一个有趣的文章有类似的解释typealias.com/guides/star-projections-and-how-they-work
鳄鱼

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.