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
我不明白泛型中 <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 |