【发布时间】:2015-03-26 05:46:47
【问题描述】:
下面是一个关于“动物吃食物”的故事,还有一只猫吃鱼。
class Food
abstract class Animal {
type F
def eat(food: F)
}
class Fish extends Food
class Cat extends Animal {
type F = Fish
def eat(fish: F) {
println("eat " + fish.getClass.getSimpleName)
}
}
(new Cat).eat(new Fish) //eat Fish
val animal: Animal = new Cat
animal.eat(new Fish) //error: type mismatch
现在我已经使用了抽象类型成员(或类型参数),我失去了runtime polymorphism(在最后一行)。 (即使用基本类型 Animal 键入任意子类型并运行没有问题。)
否则我可以从 Animal 中删除类型参数并在 Cat 中进行类型检查:
abstract class Animal {
def eat(food: Food)
}
class Cat extends Animal {
def eat(food: Food) {
food match {
case fish: Fish => println("eat" + fish)
case _ => throw new IllegalArgumentException("I only eat fish")
}
}
}
但我希望为他们提供更好的打字体验。
那么我可以在使用类型参数/泛型时保留运行时多态性吗?
【问题讨论】:
标签: scala generics polymorphism abstract-type