我正在读Scala中的书编程的部分20.7,我想知道为什么尽管该代码编译:Scala的类型:A类不等于,其中T为T:类型T = A
class Food
class Fish extends Food
class Grass extends Food
abstract class Animal {
type SuitableFood <: Food
def eat(food: SuitableFood)
}
class Cow extends Animal {
type SuitableFood = Grass
override def eat(food: Grass) {}
}
val bessy: Animal = new Cow
bessy eat (new bessy.SuitableFood)
此代码不会(在代码的其余部分是和以前一样,只是最后一行的变化):
bessy eat (new Grass)
而且据我了解草的类型是一样的Cow.SuitableFood的。
另外,我有一个关于这个例子另一个问题:
如果BESSY的类型是动物,怎么能编译器知道它需要一个类型SuitableFood - >草,而不是一个类型的食物? “因为试图提供一种新的食物给我的类型不匹配的编译错误,但是类动物需要食品和BESSY的类型是明确定义:动物
建议:将标记_path-dependent-type_添加到此问题。这可能会吸引更多地了解这种困难的人的答案。 (我仍然在努力与路径依赖类型本身。) –
@ BenKovitz补充,谢谢。 – vicaba