我有:
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()
放在这个盒子里,为什么?协方差适用于类和超类。 怎么了?
如何只为苹果和超级类使用水果盒的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>
(并且如果您从FruitBox
中删除out
(,它将编译。问题是你可以用这个值做很多有用的事情。
如果您的意思是所有FruitBox
都应该只包含Apple
和上层阶级:
这将是一个下限,Kotlin 目前不支持下限;
它有一个不明显的效果,即
val apple6 = FruitBox(SmallApple()) val apple7 = FruitBox("")
仍然有效。只是推断分别为
FruitBox<Apple>
和FruitBox<Any>
。