Martin Odersky のProgramming in Scalaで抽象型の Animal/Food の例を試していたとき、
class Food
abstract class Animal {
type SuitableFood <: Food
def eat(food:SuitableFood)
}
class Grass extends Food
class Cow extends Animal {
type SuitableFood=Grass
override def eat(food:SuitableFood) {}
}
val bessy:Animal = new Cow
bessy.eat(new Grass)
次のエラーが発生しました。
scala> <console>:13: error: type mismatch;
found : Grass
required: bessy.SuitableFood
bessy.eat(new Grass)
^
Martin による元の例はbessy.eat(new Fish)
で、これは間違いなく失敗しますが、同様に失敗するとは思っていませんでしGrass
た。上記のエラーは、 : の代わりに be を使用することで回避できbessy
ます。Cow
Animal
val bessy:Cow = new Cow
これは、ここでは動的バインディングが機能しないということですか?
編集: Scala での通常の継承のための単純な動的バインディング:
abstract class Parent {
def sig:String = "Parent"
}
class Child extends Parent {
override def sig:String = "Child"
}
そして、私はこれを持っていました.Childx:Parent
も与えました:
scala> new Child().sig
res1: String = Child
val x:Parent = new Child()
x: Parent = Child@3a460b07
x.sig
res2: String = Child