2016-04-26 9 views
2

spark-shell replで以下のコードを実行できません。工場出荷時のスパークシェルの例エラー

<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で正常に動作します:これは私がエラーを取得するScala cookbook example provided by Alvin Alexander からの再生です。この例をスパークシェルでも動作させる方法を教えてください。

ありがとうございました!

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'コマンドを使用すると、' Animal'コンパニオンが一緒にコンパイルされます。それはあなたの質問ですか? –

+0

ありがとう@ som-snytt。私はペーストを使用します。あなたのコメントの後、私はspark-shellでこれらを実行していて、scala replではないことに気付きました。私は私の質問を変えます。 –

+2

おそらくhttps://issues.scala-lang.org/browse/SI-9740。 'Animal(" pug ")// show'を試してみると、インポートされたものが表示されることがあります。 –

答えて

2

SOM-snyttが指摘したように、これは最も可能性の高いa version of an existing scala bug.

Animal("dog") // show 

このようなものでの結果である:Animalが二回インポートされていることを

import $line15.$read.INSTANCE.$iw.$iw.Animal; 
val $line15$read = $line15.$read.INSTANCE; 
import $line15$read.$iw.$iw.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あなたの代わりにこれを取得する:あなたが唯一の1を取得

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

注意、より簡潔なインポートを。興味深いサイドノートとして

、あなたが最初のコードと2番目を実行する場合、この中に、その後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

偉大な、ありがとう! –

関連する問題