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

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

问题描述:

我无法在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 
    } 
} 
+0

使用':paste'命令,这样'动物'同伴一起编译。这是你的问题吗? –

+0

谢谢@ som-snytt。我使用:粘贴。在您发表评论后,我意识到我正在使用spark-shell而不是scala repl。我会改变我的问题。 –

+2

可能是https://issues.scala-lang.org/browse/SI-9740。如果你尝试'动物(“帕格”)//显示'它可能会显示什么是进口。 –

由于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进口仍然存在。

+0

太好了,谢谢! –