在 SPARK REPL 上出错(对 A 的引用不明确)并且在 Intellij 和 Scala REPL 中工作正常?

Gives Error on SPARK REPL (reference to A is ambiguous ) and Works fine in Intellij and 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

但是当尝试在 REPL 上执行此操作时:

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")

我在这里错过了什么?如果可以,请详细解释一下,这将有所帮助。

这是 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 = apacakage.A@6e818345