我已经开始阅读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)
答案 0 :(得分:2)
我在这里猜测,您所说的“不起作用”是指您没想到能够set
将Dog
插入您的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)
时,您将引发异常。