Вложенные объектные классы Scala в Eclipse Java

Я не могу ссылаться на классы Scala из кода Java при использовании Eclipse IDE. Рассматриваемый класс Scala вложен в структуру объекта Scala. При попытке использовать класс в коде Java Eclipse жалуется на использование двоичного имени.

Ниже приведен пример кода Scala, определяющего интересующий класс (Inner):

package mypackage;

object Outer {
  object Middle {
    class Inner {
      def msg() {
        println("Running");
      }
    }
  }
}

Чтобы использовать класс Inner в коде Java, я использую следующий код:

mypackage.Outer$Middle$Inner inner = new mypackage.Outer$Middle$Inner();
inner.msg();

Однако компилятор Eclipse (Indigo) жалуется на следующее сообщение в первой строке:

На вложенный тип mypackage.Outer $ Middle $ Inner нельзя ссылаться, используя его двоичное имя

Интересно, что приведенный выше код Java работает при использовании с NetBeans 6.9.1.

Это проблема компилятора Eclipse? Есть ли какие-либо флаги, позволяющие использовать двоичные имена? Или, наоборот, проблема в Scala или в том, как я ее использую?


person andrius.velykis    schedule 18.04.2012    source источник


Ответы (1)


Доступ к глубоко вложенным объектам из Java невозможен. Ни из Eclipse, ни из командной строки, ни из какого-либо инструмента сборки. При трансляции байт-кода теряется информация о вложении.

Eclipse не позволяет использовать $ имена, поэтому будет жаловаться. Если вам небезразлично взаимодействие с Java, вам следует придерживаться Java-подобного Scala по границам. Классы верхнего уровня, чистые черты или абстрактные классы, никаких методов высшего порядка и т. Д.

person Iulian Dragos    schedule 20.04.2012
comment
Так является ли тот факт, что Netbeans успешно запускает код, просто счастливое исключение с их стороны? - person andrius.velykis; 21.04.2012
comment
Я был бы очень удивлен, если бы это произошло. Какой синтаксис работает в Netbeans? - person Iulian Dragos; 03.05.2012
comment
Точно такой же синтаксис, как описано в вопросе. Я создаю архив Scala и использую его в проекте Java NetBeans. Я добавил в GitHub пример исполняемого файла: github.com/andriusvelykis/scala-nested-class -netbeans - person andrius.velykis; 08.05.2012
comment
@IulianDragos Я уже не в первый раз вижу, как NetBeans принимает то, чего не поддерживает Eclipse. Eclipse использует собственный инкрементный компилятор, поэтому он может работать только с JRE, а не с установленным JDK. NetBeans, с другой стороны, ожидает наличия JDK и использует предоставленный там компилятор. Поправьте меня, если я ошибаюсь в этом. В любом случае компилятор Eclipse может вести себя иначе, чем обычный javac. И это могло произойти либо по ошибке, либо из-за более строгого соблюдения спецификации. Скорее всего, если вы создадите с помощью Ant или Maven, используя отдельный JDK, это сработает. - person G_H; 17.10.2012