无法通过下限规则限制方法

时间:2018-12-28 13:05:44

标签: scala generics lower-bound

我已经开始阅读Scala泛型。谁能解释为什么白代码起作用?

sealed abstract class Animal

class Cat extends Animal
class Dog extends Animal

class Box[A >: Animal] {
  def set(a: A): A = ???
}

val catBox: Box[Animal] = new Box[Animal]
val dog = new Dog
catBox.set(dog)

2 个答案:

答案 0 :(得分:2)

我在这里猜测,您所说的“不起作用”是指您没想到能够setDog插入您的catBox,因为{{ 1}}不是Dog的超类。

这是预期的。您对Animal的定义变为 Box[Animal].set。现在,def set(a: Animal): Animal Dog,因此它满足定义。

我不太了解您的意图。绑定在Animal上的类型限制了您可以创建的框的类型:

Box

但是为什么要这样限制它并没有多大意义。 也许,您想要上限:

 new Box[Animal] // compiles
 new Box[Dog]    // does not compile - Dog is not a superclass of Animal
 new Box[Any]    // compiles - Any is a superclass of everything 

答案 1 :(得分:0)

运算符???等效于throw new NotImplementedError

因此,当您致电catBox.set(dog)时,您将引发异常。