不能通过 Lower-bound 规则限制方法

Can't restrict method by Lower-bound rule

我已经开始阅读有关 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)

运算符???等同于throw new NotImplementedError.

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

我在这里猜测,您所说的 "does not work" 的意思是您没想到能够 set 一个 Dog 到您的 catBox,因为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 

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

 class AnimalBox[A <: Animal]
 val animalBox = new AnimalBox[Animal] // compiles
 val dogBox = new AnimalBox[Dog] // compiles: Dog is a subclass of Animal
 val catBox = new AnimalBox[Cat] // compiles: Cat is a subclass of Animal
 val badBox = new AnimalBox[Any] // does not compile: Any is not a subclass

 animalBox.set(new Dog) // compiles: Dog is an Animal
 animalBox.set(new Cat) // compiles: Cat is an Animal
 animalBox.set(new Pear) // does not compile: Pear is not an Animal

 dogBox.set(new Dog) // compiles
 dogBox.set(new Cat) // does not compile: cat is not a dog