scala - 使用 Scala 符号文字会导致 NoSuchMethod

标签 scala dsl symbols literals nosuchmethoderror

我最近开始使用 Scala。我在其中编写了一个 DSL,可用于描述 medici 中的处理管道。 。在我的 DSL 中,我使用符号来表示 anchor ,它可用于在管道中放置 fork (或 T 恤,如果您愿意)。这是一个正确运行的小示例程序:

object Test extends PipelineBuilder {
    connector("TCP") / Map("tcpProtocol" -> new DirectProtocol())
    "tcp://localhost:4858" --> "ByteToStringProcessor" --> Symbol("hello")
    "stdio://in?promptMessage=enter name:%20" --> Symbol("hello")
    Symbol("hello") --> "SayHello" / Map("prefix" -> "\n\t")  --> "stdio://out"
}

出于某种原因,当我在程序中使用符号文字时,我在运行时收到 NoSuchMethod 异常:

java.lang.NoSuchMethodError: scala.Symbol.intern()Lscala/Symbol;
        at gov.pnnl.mif.scaladsl.Test$.<init>(Test.scala:7)
        at gov.pnnl.mif.scaladsl.Test$.<clinit>(Test.scala)
        at gov.pnnl.mif.scaladsl.Test.main(Test.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at scala.tools.nsc.ObjectRunner$$anonfun$run$1.apply(ObjectRunner.scala:75)
        at scala.tools.nsc.ObjectRunner$.withContextClassLoader(ObjectRunner.scala:49)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:74)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:154)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

无论符号如何使用,都会发生这种情况。具体来说,我尝试在管道和简单的 println('foo) 语句中使用该符号。

问题:什么可能导致符号文字的存在导致 NoSuchMethodError?在我的 DSL 中,我使用一个隐式函数将符号转换为 Anchor 类的实例,如下所示:

    implicit def makeAnchor(a: Symbol):Anchor = anchor(a)

遗憾的是,我对 Scala 的理解还很薄弱,我无法想象为什么这会导致我的 NoSuchMethodError。

最佳答案

最可能的解释是,您使用的 Scala 版本与运行时类路径上的版本不同。

检查Scala的运行时版本

将以下内容添加到您的 main() 方法中:

println(classOf[scala.Symbol].getProtectionDomain.getCodeSource)

这将告诉您从哪里加载 Scala 库,例如:

(file:/Users/jason/usr/scala-2.8.0.RC2/lib/scala-library.jar )

检查Scala的编译时版本

我不知道你是如何调用scalac的。假设它是从命令行运行的,请运行scalac -version

关于scala - 使用 Scala 符号文字会导致 NoSuchMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2863091/

相关文章:

java - RouteToRecipients Java DSL 无法将多个消息发送到 defaultOutputChannel

jenkins job dsl - 没有方法签名 : java. lang.String.call()

symbols - ELF保留部分

python - 什么符号 |在 Python 中是什么意思?

java - 如何在 apache Camel 中获取 DSL(领域特定语言)列表?

javascript - 获取区域设置的货币符号

scala - SparkSQL.createDataFrame 中出现奇怪的类型转换错误

scala - 如何在 Scala 中将 Map[Symbol, List[A]] 转换为 List[Map[Symbol,A]] ?

Scala Breeze(数值处理库);如何将 Int 的 DenseMatrix 转换为 Doubles 的 DenseMatrix?

scala - 缺少非详尽匹配的警告