gpt4 book ai didi

kotlin - Kotlin通用类的限制

转载 作者:行者123 更新时间:2023-12-02 13:34:47 24 4
gpt4 key购买 nike

我有:

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

but i want FruitBox only for apple and upper classes (in this case - Fruit) so how to use out/in here



如果您是指特定的 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>
  • 关于kotlin - Kotlin通用类的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59117493/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com