Kotlin泛型类中的限制

Kotlin泛型类中的限制,kotlin,covariance,Kotlin,Covariance,我有: 现在我尝试使用协方差 open class Fruit open class Apple : Fruit() class SmallApple : Apple() class水果盒(水果:T) 所以在我看来,有了“出局”,我应该可以 class FruitBox<out T>(fruit: T) val apple2=水果盒(Apple()) val apple3=FruitBox(Fruit())-未编译,-为什么? 但是我不能把水果放在这个盒子里,为什么?协方差适

我有:

现在我尝试使用协方差

open class Fruit
open class Apple : Fruit()
class SmallApple : Apple()
class水果盒(水果:T)
所以在我看来,有了“出局”,我应该可以

class FruitBox<out T>(fruit: T)
val apple2=水果盒(Apple())
val apple3=FruitBox(Fruit())-未编译,-为什么?
但是我不能把水果放在这个盒子里,为什么?协方差适用于类和超类。。 怎么了


如何仅对Apple和super类使用out/in for FruitBox?

因为
FruitBox
的构造函数参数必须具有类型
T
,因此特别是对于
FruitBox
它必须具有类型
Apple
<代码>水果()没有此类型

out
在这里并不重要;这意味着
水果盒
水果盒
的一个子类型,因此您可以

    val apple2 = FruitBox<Apple>(Apple())
    val apple3 = FruitBox<Apple>(Fruit()) - not compile, - why ?
如果
..
具有类型
水果盒
水果盒
水果盒
(如果从
水果盒
中删除
out
),它将编译。问题是这个值没有什么用处

如果您的意思是所有的
水果盒
应该只包含
苹果
和上层阶级:

  • 这是一个下限,Kotlin目前不支持这个下限

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

    val apple5: FruitBox<in Apple> = ...
    
    这仍然有效。它只是被分别推断为
    水果盒
    水果盒


  • 我想它应该是
    类水果盒(fruit:T)
    也不起作用。约束底部类型的用例是什么?但我只想要苹果和上层阶级的水果盒(在本例中为-fruit),那么如何在这里使用out/in?kotlin如何不支持?来自官方文档:“数组对应于Java的ArrayNot支持类/接口和方法定义,仅在使用上。您没有与
    类水果盒
    等效的数组。显然Java也不允许,但Scala允许。
    val apple5: FruitBox<in Apple> = ...
    
    val apple6 = FruitBox(SmallApple())
    val apple7 = FruitBox("")