請讓我知道如何使下面的一段代碼按預期工作。問題是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
是Animal
,而不是一個Dog
失敗。
編譯器應該如何推斷'd'是'Dog'? – Giorgio
@giorgio,這就是我想要理解的。我看到了這個問題,但我不知道如何解決它,除了爲每個類添加更多的代碼。 – GGGforce
'd'不能是'Pet'類型(由函數'name()'所要求的),因爲'Animal.apply()'返回一個'Animal'並不是所有的動物都是'Pet'。例如,「狼」不是「寵物」。所以編譯器是正確的抱怨你的類型:如果** all **'Animal.apply()'的可能結果都是'Pet'類型,''d''''可以具有'Pet'類型。 – Giorgio