Kotlin通用类的限制

时间:2019-11-30 15:18:54

标签: kotlin covariance

我有:

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?

1 个答案:

答案 0 :(得分:1)

因为FruitBox<T>的构造方法参数必须具有类型T,所以特别是对于FruitBox<Apple>,它必须具有类型AppleFruit()没有这种类型。

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和上层阶级:

  1. 这是一个下限,Kotlin当前不支持该下界;

  2. 它具有非显而易见的作用,即

    val apple6 = FruitBox(SmallApple())
    val apple7 = FruitBox("")
    

    仍然可以使用。只是推断分别为FruitBox<Apple>FruitBox<Any>