次のコードを意図したとおりに動作させる方法を教えてください。問題は、私のファクトリが具体的なクラスを返していることを 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
。