【发布时间】:2015-08-22 21:46:21
【问题描述】:
我正在阅读《Scala 编程》一书的第 20.7 节,我想知道为什么这段代码会编译:
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 是 Animal 类型,编译器怎么知道它需要一个类型合适的食物 -> 草而不是一个类型的食物?因为试图提供一个新的食物给我一个类型不匹配的编译错误,但是类 Animal 需要一个类型 Food 并且明确定义了 bessy 的类型:Animal
【问题讨论】:
-
建议:在这个问题中添加标签path-dependent-type。这可能会吸引更了解这种困难的人的回答。 (我自己还在为依赖路径的类型而苦苦挣扎。)
-
@BenKovitz 已添加,谢谢。
标签: scala types path-dependent-type