抽象型に関するOderskyetalによる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はGrassなので、なぜこれが機能しないのですか?