【问题标题】:Gives Error on SPARK REPL (reference to A is ambiguous ) and Works fine in Intellij and Scala REPL?在 SPARK REPL 上给出错误(对 A 的引用不明确)并且在 Intellij 和 Scala REPL 中工作正常?
【发布时间】:2016-11-24 07:16:55
【问题描述】:

我有一个示例代码:

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

我在这里缺少什么?如果可以的话,请详细解释一下,这会很有帮助。

【问题讨论】:

  • 对我来说很好用。
  • 它适用于 Scala REPL 那么为什么它不适用于 SPARK REPL 呢?

标签: scala class apache-spark read-eval-print-loop companion-object


【解决方案1】:

这是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2020-03-26
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多