Использование буквального символа Scala приводит к NoSuchMethod - PullRequest
2 голосов
/ 19 мая 2010

Я недавно начал использовать 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.

Ответы [ 2 ]

4 голосов
/ 25 мая 2010

Наиболее вероятным объяснением является то, что вы компилируете версию Scala, отличную от той, которая указана в пути к классам во время выполнения.

Проверка рабочей версии Scala

Добавьте в метод main () следующее:

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

Это скажет вам, откуда вы загружаете библиотеку Scala, например:

(файл: /Users/jason/usr/scala-2.8.0.RC2/lib/scala-library.jar)

Проверка версии Scala во время компиляции

Я не знаю, как вы вызываете скаляр. Предполагая, что это из командной строки, запустите scalac -version.

1 голос
/ 19 мая 2010

Возможно, у вас установлено несколько версий Scala, как минимум из источника 2.7.1 (http://scala -tools.org / scaladocs / scala-library / 2.7.1 / Symbol.scala .html ) не похоже, что у Symbol есть метод интерна?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...