火花壳中的工厂方法示例给出错误



我无法在火花外壳 repl 中运行以下代码。这是Alvin Alexander提供的Scala食谱示例的复制品我收到错误:

<console>:22: error: reference to Animal is ambiguous;
it is imported twice in the same scope by
import $VAL11.Animal
and import INSTANCE.Animal
       val test = Animal("dog")

这适用于 Scala repl。你能告诉我如何让这个例子也适用于火花壳吗?

非常感谢您的帮助!

trait Animal {
    def speak
}
object Animal {
    private class Dog extends Animal {
        override def speak = {
            println("woof")
        }
    }
    private class Cat extends Animal {
        override def speak { println("meow") }
    }
    def apply(s: String):Animal = {
        if (s == "dog") return new Dog
        else return new Cat
    }
}

# repl
Animal("dog") 
# compiling
object test {
    def main(args: Array[String]){
        Animal(args(0)).speak
    }
}

正如 som-snytt 指出的那样,这很可能是现有 scala 错误的一个版本。

Animal("dog") // show 

结果如下:

import $line15.$read.INSTANCE.$iw.$iw.Animal;
val $line15$read = $line15.$read.INSTANCE;
import $line15$read.$iw.$iw.Animal;

请注意,Animal 导入两次。要解决此问题,您可以将代码包装在object中:

object test{
  trait Animal {
    def speak
  } 
  object Animal {
    private class Dog extends Animal {
      override def speak = {
        println("woof")
      }
    }
    private class Cat extends Animal {
      override def speak { println("meow") }
    }
    def apply(s: String):Animal = {
      if (s == "dog") return new Dog
      else return new Cat
    }
  } 
}

现在,当您调用test.Animal("dog") // show时,您会得到以下内容:

val $line15$read = $line15.$read.INSTANCE;
import $line15$read.$iw.$iw.$iw.$iw.$iw.$iw.$iw.$iw.test;

请注意,您只能获得一个更简洁的导入。

作为一个有趣的旁注,如果你运行第一个代码,然后运行第二个代码,那么test.Animal("dog")结果如下:

import $line15.$read.INSTANCE.$iw.$iw.Animal;
val $line16$read = $line16.$read.INSTANCE;
import $line16$read.$iw.$iw.$iw.$iw.$iw.$iw.$iw.$iw.test;

Animal导入仍然存在的地方。

相关内容

最新更新