【发布时间】:2016-06-10 20:07:04
【问题描述】:
Scala n00b 在这里。很确定我了解 PDT,但确定并遇到了问题;这是上一个问题Scala types: Class A is not equal to the T where T is: type T = A 的示例代码,我将在此处重现:
1: class Food
2: class Fish extends Food
3: class Grass extends Food
4:
5: abstract class Animal {
6: type SuitableFood <: Food
7: def eat(food: SuitableFood)
8: }
9:
10: class Cow extends Animal {
11: type SuitableFood = Grass
12: override def eat(food: Grass) {}
13: }
14:
15: val bessy: Animal = new Cow // [1]
16:
17: bessy eat (new bessy.SuitableFood) // [2]
原贴说这个编译,我相信应该,但不会。如果我将它粘贴到 scala REPL 中,它会成功创建 bessy [1]:
scala> val bessy: Animal = new Cow
bessy: Animal = Cow@165b8a71
但是 [2] 给了我一个我不明白的错误:
scala> bessy.eat(bessy.SuitableFood)
<console>:17: error: value SuitableFood is not a member of Animal
bessy.eat(bessy.SuitableFood)
^
如果我将它粘贴到一个文件中并“scalac”它,我会得到相同的结果。为什么? bessy 是牛对象,type SuitableFood = Grass 是在其中定义的,bessy.SuitableFood 是类类型(不是吗?)。
怎么了?
【问题讨论】: