我正在讀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