我有:
open class Fruit
open class Apple : Fruit()
class SmallApple : Apple()
现在我尝试使用协方差
class FruitBox<out T>(fruit: T)
因此,我认为如果“不参加”,我应该可以
val apple2 = FruitBox<Apple>(Apple())
val apple3 = FruitBox<Apple>(Fruit()) - not compile, - why ?
但是我不能在这个盒子里放
Fruit()
,为什么呢?协方差适用于一流和超一流。怎么了?
如何只对Apple和 super 类的FruitBox使用out / in?
最佳答案
因为FruitBox<T>
的构造函数参数必须具有T
类型,所以特别是对于FruitBox<Apple>
,它必须具有Apple
类型。 Fruit()
没有此类型。out
在这里并不重要。这意味着FruitBox<Apple>
是FruitBox<Fruit>
的子类型,因此您可以执行
val apple4: FruitBox<Fruit> = apple2
如果您是指特定的
FruitBox
值,则可以编写val apple5: FruitBox<in Apple> = ...
如果
...
的类型为FruitBox<Apple>
,FruitBox<Fruit>
或FruitBox<Any>
(并且如果您从out
中删除FruitBox
),它将进行编译。问题在于,使用此值几乎无用。如果您的意思是所有
FruitBox
应该只包含Apple
和上层类:val apple6 = FruitBox(SmallApple())
val apple7 = FruitBox("")
仍然可以。只是分别推断为
FruitBox<Apple>
和FruitBox<Any>
。