spark-shell给出错误的工厂方法示例

时间:2016-04-26 00:37:41

标签: scala design-patterns apache-spark factory-method

我无法在spark-shell repl中运行以下代码。这是Scala cookbook example provided by Alvin Alexander的复制品 我收到错误:

<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。你能告诉我如何让这个例子在spark-shell上工作吗?

非常感谢你的帮助!

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
    }
}

1 个答案:

答案 0 :(得分:2)

正如som-snytt所指出的,这很可能是a version of an existing scala bug.

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导入仍然存在的位置。