在《 Scala 编程( 3rd )》中,20.6 抽象类型这一节中,本人有个非常不解的地方,书中提到:
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 // 能通过编译且运行 小弟不才,一直没理解,希望各位大佬轻喷
