重複の可能性:
Scala: 抽象型とジェネリック
「プログラミング in Scala」の第 20.6 章「抽象型」では、抽象型の使用について、次の結果コードで終わる例で説明しています。
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: Grass) {}
}
これらの定義では、 のオブジェクトはCow
魚を食べることができません。
class Fish extends Food
val bessy: Animal = new Cow
bessy eat (new Fish) // Error, type mismatch
抽象型の使用に関するこの良い例を読んだ後、なぜ代わりに型パラメーターを使用しないのか疑問に思いました。
class Food
abstract class Animal[T <: Food] {
def eat(food: T)
}
class Grass extends Food
class Cow extends Animal[Grass] {
override def eat(food: Grass){}
}
class Fish extends Food
val bessy: Animal[Grass] = new Cow
bessy eat (new Fish) // Also ends in a type mismatch error !
ここで抽象型の代わりに型パラメーターを使用する違いはどこにありますか?