kotlin 泛型中 <out Any?> 和 <*> 的区别

Difference between <out Any?> and <*> in generics in kotlin

我不明白泛型中 <out Any?><*> 之间的区别。我知道使用 <*> 就像同时执行 <out Any?><in Nothing>,但使用 <out Any?> 会导致相同的结果。

主要区别在于您不能在声明为逆变的类型参数上使用 out Any? 投影(在声明位置使用 in)——它的所有使用位置都必须也可以显式或隐式 in-投影。

此外,对于具有上限 T : TUpper 的类型参数,您不能将 out 投影与不是 TUpper 子类型的类型参数一起使用。例如,如果类型声明为 Foo<T : Number>,则投影 Foo<out Any?> 无效。在 Foo<*> 的情况下,星投影的 out 部分表示上限,而不是 Any?

无界

For the generic type * projection is same as
Invariant<T> Invariant<out Any?> and Invariant<in Nothing>
Covariant<out T> Covariant<out Any?>
Contravariant<in T> Contravariant<in Nothing>

有边界

For the generic type * projection is same as
Invariant<T : SomeType> Invariant<SomeType> and Invariant<in Nothing>
Covariant<out T : SomeType> Covariant<out SomeType>
Contravariant<in SomeType : T> Lower bound is not supported