我有:

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和上层类:
  • 这将是一个下限,Kotlin当前不支持;
  • 具有非显而易见的作用,即
    val apple6 = FruitBox(SmallApple())
    val apple7 = FruitBox("")
    

    仍然可以。只是分别推断为FruitBox<Apple>FruitBox<Any>
  • 10-08 03:45