为什么 Scala 枚举在 Apache Zeppelin 中不起作用但在 Maven 中有效

Why Scala Enumeration does not work in Apache Zeppelin but it works in maven

当我在 Maven 项目(使用相同的 Scala 版本)中使用它时,枚举按预期工作。

object t {
  object DashStyle extends Enumeration {
    val Solid,ShortDash = Value
  }

  def f(style: DashStyle.Value) = println(style)

  def main(args: Array[String]) = f(DashStyle.Solid)
}

但是当它运行在 Apache Zeppelin(Zeppelin 0.6, Spark 1.6, Scala 2.10, Java 1.8)

object DashStyle extends Enumeration {
    val Solid,ShortDash = Value
}

def f(style: DashStyle.Value) = println(style)

f(DashStyle.Solid) 

它报告以下错误,即使它说找到和需要的类型完全相同

<console>:130: error: type mismatch;
 found   : DashStyle.Value
 required: DashStyle.Value
              f(DashStyle.Solid)

为什么以及如何使用它?

我想出了解决这个问题的诀窍。

在 Apache Zeppelin(或 Scala REPL)中。为了使用 Enumeration 或 sealed&object,它应该被包裹在 object 中而不是直接在根范围上定义。

之所以在maven中能用,是因为我已经把它放到一个对象中了。

在 Zeppelin 段落中的对象中定义枚举

object t {
  object DashStyle extends Enumeration {
    val Solid,ShortDash = Value
  }

  def f(style: DashStyle.Value) = println(style)
}

然后在 Zeppelin 段落中使用它

import t._
f(DashStyle.Solid)