2014-02-06 2 views
2

Я пытаюсь un-Spring IoC несколько классов Java и загружать их непосредственно в некоторый код Scala. Естественно, я нахожу, что есть пространство имен конфликтов между пакетом, какКласс SomeClass в пакете x недоступен в com.a.y.x

com.a.x.SomeClass 

и

com.a.y.x.SomeClass 

Я попытался с помощью пространства имен резольверами импорта, как

import com.a.y.x.{ SomeClass => YYYSomeClass } 
import com.a.x{ SomeClass => XXXSomeClass } 

Это чистит но ссылаясь на те классы, которые позже в классах показывают ошибку, как зависающую в ScalaIDE, и после чистых компиляций.

Когда я компилирую из Gradle плагина лестницы, или через типизированный ScalaIDE с Скале 2.10.2 или 2.10.3, я получаю следующий тип не-полезно сообщений об ошибке:

class SomeClass in package x cannot be accessed in com.a.y.x 

Проблема возникает если я попытаюсь использовать класс из com.ayx, который не имеет конфликта пространства имен. Если бы я попробовать некоторые из scalac флагов, я также был в состоянии получить предупреждение, что это немного отличается (на стадии TypeR):

class SomeClass in package x cannot be accessed in y.this.x 

Я бы очень хотел бы знать, если есть способ расширить первая ссылка на пакет. У меня возникли проблемы с настройкой проекта Eclipse для отладки компилятора scalac, и я не нашел флаг scalac, который добавляет полезную информацию об ошибке.

Ошибка возникает, когда я либо пытаюсь установить ctx.getBean("someClass").asInstanceOf[XXXSomeClass], либо new XXXSomeClass.

Ссылка из предупреждения заставляет меня думать, что есть некоторые путаницы в работе. Я не думаю, что это проблема classpath в более крупном проекте, над которым я работаю, потому что удаление одной банки устраняет возможность разрешения импорта, однако я не могу воспроизвести ее с помощью простых классов примеров в отдельном проекте.

Немного больше информации о java-классах - разные конфликтующие пакеты java находятся в отдельных банках, которые были скомпилированы с помощью 1,6-символа Java. Они являются высшими уровнями, общедоступными классами, хотя два являются синглтонами с частными конструкторами и соответствующими общедоступными статическими методами getInstance().

+0

Я бы «уйти» на х или у пакета в таких случаях и использовать 'х. SomeClass' или 'y.SomeClass' (но, вероятно, только на одном). – user2864740

+0

@ user2864740 - Я пробовал полные пути без импорта и получал те же ошибки. Я думаю, что я также пробовал импорт из одного пакета и полный путь к другому, но завтра я проверю. – n0741337

+0

@ som-snytt - отношения классов в некоторых случаях сложнее - я выложу больше завтра. Пакет класса scala по сравнению с java похож на 'package total.unrelated'. Не могли бы вы уточнить, какую аннотацию вы думаете, что я должен попробовать? – n0741337

ответ

1

Это действительно ошибка доступа. Я думаю, что это просто плохое сообщение об ошибке. Java был скомпилирован отдельно и доступ к ним из файлов jar. Я не уделял достаточно внимания природе package private классов, которые я хотел создать (я видел «общественность» перед некоторыми из них и не тщательно проверял их). В этом случае столкновения пространства имен были красно-селедки и фактически не влияли на вывод сообщения об ошибке.

В некоторых случаях существуют публичные интерфейсы, которые я могу использовать с небольшим весенним клеем для создания объектов и загрузки их в класс Scala.

Сообщение об ошибке scalac было бы более полезным, если бы она имела вид:

class SomeClass in package com.a.y.x cannot be accessed in totally.unrelated 

где первая ссылка пакета является пакетом Класса Java и пакет трейлинга является пакет класса Scala пытается создать экземпляр класс Java.

Чтобы резюмировать - класс Java был как:

package com.a.y.x.SomeClass 

class SomeClass extends SomeOtherClass implements SomeInterface 

и должно быть, как:

package com.a.y.x.SomeClass 

public class SomeClass extends SomeOtherClass implements SomeInterface 

, чтобы не получить эти ошибки доступа.

Поскольку у меня больше контроля над Scala здесь, по прихоти я попытался сменить пакет класса Scala от totally.unrelated до com.a.x.y, который затем компилируется чисто. Как вы могли догадаться, это просто отбрасывает ошибку на ошибку времени выполнения ->java.lang.IllegalAccessError. Однако IllegalAccessError из Java имеет порядок описания/пакет, который я думаю, что должно произойти в ошибки компиляции из scalac:

...java.lang.IllegalAccessError: tried to access class com.a.y.x.SomeClass from class s.Trouble$delayedInit$body 
Смежные вопросы