可能重复:
Scala:抽象类型与泛型
“Scala 编程”的第 20.6 章“抽象类型”解释了抽象类型的使用,并带有一个以以下结果代码结尾的示例:
class Food
abstract class Animal {
type SuitableFood <: Food
def eat(food: SuitableFood)
}
class Grass extends Food
class Cow extends Animal {
type SuitableFood = Grass
override def eat(food: Grass) {}
}
有了这些定义,对象Cow
不能吃鱼:
class Fish extends Food
val bessy: Animal = new Cow
bessy eat (new Fish) // Error, type mismatch
在阅读了这个关于使用抽象类型的好例子之后,我想知道,为什么我们不只使用类型参数呢?
class Food
abstract class Animal[T <: Food] {
def eat(food: T)
}
class Grass extends Food
class Cow extends Animal[Grass] {
override def eat(food: Grass){}
}
class Fish extends Food
val bessy: Animal[Grass] = new Cow
bessy eat (new Fish) // Also ends in a type mismatch error !
在这里使用类型参数而不是抽象类型有什么区别?