请让我知道如何使以下代码按预期工作。问题是 Scala 编译器不明白我的工厂正在返回一个具体的类,所以我的对象以后不能使用。TypeTags 或类型参数有帮助吗?还是我需要以其他方式重构代码?我(显然)是 Scala 的新手。
trait Animal
trait DomesticatedAnimal extends Animal
trait Pet extends DomesticatedAnimal {var name: String = _}
class Wolf extends Animal
class Cow extends DomesticatedAnimal
class Dog extends Pet
object Animal {
def apply(aType: String) = {
aType match {
case "wolf" => new Wolf
case "cow" => new Cow
case "dog" => new Dog
}
}
}
def name(a: Pet, name: String) {
a.name = name
println(a +"'s name is: " + a.name)
}
val d = Animal("dog")
name(d, "fred")
最后一行代码失败,因为编译器认为d
是 a Animal
,而不是 a Dog
。