我有:
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 ?
但是我不能在此Box中放入Fruit()
,为什么?协方差适用于一流和超一流。
怎么了?
如何仅对Apple和超级类使用FruitBox的out / in?
答案 0 :(得分:1)
因为FruitBox<T>
的构造方法参数必须具有类型T
,所以特别是对于FruitBox<Apple>
,它必须具有类型Apple
。 Fruit()
没有这种类型。
out
在这里并不重要;这意味着FruitBox<Apple>
是FruitBox<Fruit>
的子类型,因此您可以做到
val apple4: FruitBox<Fruit> = apple2
但是我只希望FruitBox仅适用于苹果和上层阶级(在这种情况下为Fruit),所以如何在此处使用/使用
如果您指的是特定的FruitBox
值,则可以编写
val apple5: FruitBox<in Apple> = ...
,如果...
的类型为FruitBox<Apple>
,FruitBox<Fruit>
或FruitBox<Any>
(并且如果您从out
中删除了FruitBox
,它将编译) 。问题在于,使用此值几乎无用。
如果您是说 all FruitBox
应该只包含Apple
和上层阶级:
这是一个下限,Kotlin当前不支持该下界;
它具有非显而易见的作用,即
val apple6 = FruitBox(SmallApple())
val apple7 = FruitBox("")
仍然可以使用。只是推断分别为FruitBox<Apple>
和FruitBox<Any>
。