不能通过 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
我已经开始阅读有关 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