我最近开始使用 Scala。我在其中编写了一个 DSL,可用于描述medici中的处理管道。在我的 DSL 中,我使用符号来表示一个锚点,它可以用来在管道中放置一个叉子(或三通,如果你愿意的话)。这是一个正确运行的小示例程序:
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。