我有:
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?
因为FruitBox<T>
的构造函数参数必须具有T
类型,所以特别是对于FruitBox<Apple>
,它必须具有Apple
类型。 Fruit()
没有这种类型。
out
在这里并不重要;这意味着FruitBox<Apple>
是FruitBox<Fruit>
的子类型,因此可以执行
val apple4: FruitBox<Fruit> = apple2
但是我只想让FruitBox仅适用于苹果和上层阶级(在这种情况下-水果),所以如何在这里使用/输入
如果是特定的FruitBox
值,则可以写
val apple5: FruitBox<in Apple> = ...
并且如果...
的类型为FruitBox<Apple>
,FruitBox<Fruit>
或FruitBox<Any>
(并且从out
中删除了FruitBox
,它将进行编译)。问题是,使用此值几乎无用。
如果您表示全部 FruitBox
应该仅包含Apple
和上层阶级:
这是一个下界,Kotlin当前不支持;
具有非明显的作用,即
val apple6 = FruitBox(SmallApple())
val apple7 = FruitBox("")
仍然可以使用。只是分别推断为FruitBox<Apple>
和FruitBox<Any>
。