Odersky 等人在 Programming in Scala 中有一个关于抽象类型的简单示例,但它似乎没有遵循它的逻辑结论[现在编辑以使其成为我的确切代码]:
class Food
class Grass extends Food
class FishFood extends Food
abstract class Animal {
type Feed <: Food
def eat(food: Feed)
}
class Cow extends Animal {
type Feed = Grass
override def eat(food: Grass) = {}
}
class Test extends App {
val cow: Animal = new Cow
cow.eat(new FishFood)
cow.eat(new Grass)
}
他们解释说这会阻止我这样做(如上所述):
val cow: Animal = new Cow
cow.eat(new FishFood)
到目前为止,一切都很好。但是下一个自然步骤似乎也不起作用:
cow.eat(new Grass)
我得到一个编译错误:
type mistmatch;
found : Grass
required: Test.this.cow.Feed
cow.eat(new Grass)
^
但是 cow.Feed 是草,那么为什么这不起作用呢?