Kotlin通用类中的限制

问题描述 投票:1回答:1

我有:

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?

kotlin covariance
1个回答
1
投票

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

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

  2. 具有非明显的作用,即

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

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

© www.soinside.com 2019 - 2024. All rights reserved.