Kotlin泛型中“*”与“任意”的区别

我不知道我完全理解SomeGeneric<*>SomeGeneric<Any>之间的区别。 我认为“*”代表任何东西(通配符),“Any”代表所有对象继承的对象。 所以看起来他们应该是一样的,但他们不是?

将星形投影看作不仅仅是表示任何类型的方式,而是一些你不知道究竟是什么的固定类型可能是有帮助的。

例如,类型MutableList<*>表示一些东西 (你不知道到底是什么)。 所以如果你尝试添加一些东西到这个列表中,你将不会成功。 它可能是一个String的列表,或者一个Int列表,或者其他的列表。 编译器将不允许将任何对象放在这个列表中,因为它不能验证列表是否接受这种类型的对象。 但是,如果您尝试从这样的列表中获取元素,那么您肯定会得到一个Any?类型的对象Any? ,因为Kotlin中的所有对象都从Any继承。

在上下文中,我想你暗示, SomeGeneric<*>相当于SomeGeneric<out Any?> 。 Java的等价物是SomeGeneric<? extends Object> SomeGeneric<? extends Object>

这个语法叫做“star-projections”。 以下是官方文档: https : //kotlinlang.org/docs/reference/generics.html#star-projections