1

У меня есть пример кода:Дает ошибку на SPARK REPL (ссылка на A неоднозначна) и отлично работает в Intellij и Scala REPL?

class A(str: String) { 
    println(s"InsideCase:::$str") 
} 

object A { 
    def apply(str: String) = { 
    println("foobar::") 
    new A(str) 
    } 
} 

object b extends App { 
    A("kool") 
} 

Этот код прекрасно работает в Intellij. И дает мне выход:

foobar:: 
InsideCAse:::kool 

Но при попытке сделать это на РЕПЛ:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class A(str: String) { 
    println(s"InsideCAse:::$str") 
} 

object A { 
    def apply(str: String) = { 
    println("foobar::") 
    new A(str) 
    } 
} 


// Exiting paste mode, now interpreting. 

defined class A 
defined object A 

scala> A("kool") 

Это дает мне следующую ошибку:

<console>:27: error: reference to A is ambiguous; 
it is imported twice in the same scope by 
import $line31$read.A 
and import INSTANCE.A 
     A("kool") 

Что я здесь отсутствует? Если вы можете подробно объяснить, что было бы полезно.

+0

Это работает хорошо для меня. –

+0

Он работает на Scala REPL, тогда почему это не работает на SPARK REPL? –

ответ

2

Это ограничение Spark REPL. Вы можете сделать это старый школьный путь с объектом обертке:

object awrapper { 

    class A(str: String) { 
    println(s"InsideCAse:::$str") 
    } 

    object A { 
    def apply(str: String) = { 
     println("foobar::") 
     new A(str) 
    } 
    } 
} 

import awrapper._ 

или определить пакет с paste -raw (Scala 2.11+):

scala> :paste -raw 
// Entering paste mode (ctrl-D to finish) 

package apacakage 

class A(str: String) { 
    println(s"InsideCAse:::$str") 
} 

object A { 
    def apply(str: String) = { 
    println("foobar::") 
    new A(str) 
    } 
} 


// Exiting paste mode, now interpreting. 


scala> import apacakage._ 
import apacakage._ 

scala> A("kool") 
foobar:: 
InsideCAse:::kool 
res1: apacakage.A = [email protected]