Kotlin 泛型类中的限制



我有:

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>它必须具有类型AppleFruit()没有这种类型。

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

  1. 这将是一个下限,Kotlin 目前不支持下限;

  2. 它有一个不明显的效果,即

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

    仍然有效。只是推断分别为FruitBox<Apple>FruitBox<Any>

相关内容

  • 没有找到相关文章

最新更新