在《 Scala 编程( 3rd )》中,20.6 抽象类型这一节P424中,本人有个非常不解的地方,书中提到:
class Food
abstract class Animal {
def eat(food: Food)
}
class Grass extends Food
class Cow extends Animal {
override def eat(food: Grass) = {} // 这不能编译
} // 如果能的话...
class Fish extends Food
val bessy: Animal = new Cow
bessy eat (new Fish) // ...你就能给牛吃草了
本人理解 override 超类方法,方法参数是不支持协变的,但是上文假设通过编译,"bessy eat (new Fish)"不是本来就不能运行吗? Fish 本来就不能上转型为 Grass 呀。何况如下重写 eat 方法岂不是同样有这个问题?
class Cow extends Animal {
override def eat(food: Food): Unit = {}
}
val cow = new Cow
cow eat new Fish
// 能通过编译且运行