Scala泛型:具有下限类型的方法的返回数据类型

Scala泛型:具有下限类型的方法的返回数据类型,scala,generics,Scala,Generics,我定义了一些Scala类: class饮料 类软饮料 可乐类饮料 类别自动售货机[A](val currentItem:选项[A],项目:列表[A]){ 定义此(项目:列表[A])=此(无,项目) def addAll[B>:A](新项目:列表[B]):自动售货机[B]= 新自动售货机(项目++新项目) } 然后,我运行了以下代码段: val colasVM:VendingMachine[Cola]=新的自动售货机(列表(新可乐,新可乐)) //它起作用了 val softDrinksVM:V

我定义了一些Scala类:

class饮料
类软饮料
可乐类饮料
类别自动售货机[A](val currentItem:选项[A],项目:列表[A]){
定义此(项目:列表[A])=此(无,项目)
def addAll[B>:A](新项目:列表[B]):自动售货机[B]=
新自动售货机(项目++新项目)
}
然后,我运行了以下代码段:

val colasVM:VendingMachine[Cola]=新的自动售货机(列表(新可乐,新可乐))
//它起作用了
val softDrinksVM:VendingMachine[Drink]=colasVM.addAll(列表(新的软饮料))
//编译错误:您可能希望将A定义为+A。(补充说明4.5)
val softDrinksVM2:VendingMachine[饮料]=新的VendingMachine[软饮料](无,空)
在我看来,
colasVM.addAll(List(new SoftDrink))
返回
VendingMachine[SoftDrink]
类型数据,不能将其分配给
VendingMachine[Drink]
变量,因为它们不是同一类型

但是
val-softDrinksVM:vendingment[Drink]=colasVM.addAll(List(new-SoftDrink))
可以在我这边成功编译,有人能解释一下原因吗


非常感谢

这是因为下限类型、类型推断和协方差

colasVM是一台自动售货机[Cola],因此它的类型参数a是Cola

方法addAll有一个类型参数B,它是a的任何超级类型。如果a是Cola,B可以是Cola、SoftDrink、Drink,甚至可以是AnyRef或any

当您调用addAll时,您并没有告诉编译器哪种类型是B,所以它必须推断它。如果softDrinksVM2是自动售货机[饮料]类型,则B必须是饮料

为什么你的代码会编译?因为列表是协变的,所以列表[软饮料]就是列表[饮料]

正如你所看到的,甚至可以做这样的事情

val softDrinksVM1: VendingMachine[AnyRef] = colasVM.addAll(List(new Object))
val softDrinksVM2: VendingMachine[AnyRef] = colasVM.addAll(List(new SoftDrink))
有关更多信息,请查看此链接