Я вижу странную ошибку при попытке скомпилировать Java-код. Компилятору не удается распознать статический внутренний класс. Допустим, я работаю над классом MyClass. Статический внутренний класс, который мне нужно использовать, имеет полное доменное имя x.y.z.Parent.DesiredClass. Этот внутренний класс импортируется явно с использованием его полного доменного имени. Родительский элемент также импортируется с использованием его полного доменного имени. Теперь существует еще один пакет с (другим, другим FQN), у которого есть класс DesiredClass. Этот другой DesiredClass находится в пути к классам, но он не импортируется явно.
Прежде чем продолжить, я должен прояснить, что изменить имена этих классов невозможно. классы.
Теперь, когда я ссылаюсь на Parent.DesiredClass в своем коде, я использую FQN Parent.DesiredClassчтобы избежать любого возможного двусмысленность. Но при компиляции я получаю сообщение об ошибке при попытке создать экземпляр Parent.DesiredClass. Мой фрагмент кода:
Код: Выделить всё
x.y.z.Parent.DesiredClass dc;
dc = new x.y.z.Parent.DesiredClass();
Код: Выделить всё
MyClass.java:123: an enclosing instance that contains x.y.z.Parent.DesiredClass is required
dc = new x.y.z.Parent.DesiredClass();
^
- предназначен для компиляции с помощью Sun Java 1.4.2_18
Код: Выделить всё
MyClass
- и other DesiredClass были скомпилированы с использованием Microsoft Java.
Код: Выделить всё
x.y.z.Parent.DesiredClass
Кроме того, при попытке компиляции с помощью Sun Java 1.4.2_18, следующее исключение возникает внутри компилятор:
Код: Выделить всё
An exception has occurred in the compiler (1.4.2_18). Please file a bug at the Java Developer Connection (http://java.sun.com/cgi-bin/bugreport.cgi) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you.
java.lang.NullPointerException
at com.sun.tools.javac.v8.code.Type.isSubTypes(Type.java:557)
at com.sun.tools.javac.v8.comp.Resolve.instantiate(Resolve.java:221)
at com.sun.tools.javac.v8.comp.Resolve.selectBest(Resolve.java:317)
at com.sun.tools.javac.v8.comp.Resolve.findMethod(Resolve.java:414)
...
at com.sun.tools.javac.v8.comp.Attr.attribClass(Attr.java:1332)
at com.sun.tools.javac.v8.JavaCompiler.compile(JavaCompiler.java:355)
at com.sun.tools.javac.v8.Main.compile(Main.java:569)
at com.sun.tools.javac.Main.compile(Main.java:36)
at com.sun.tools.javac.Main.main(Main.java:27)
Error encountered running Java Compiler
Aborting compilation.
Кто-нибудь может объяснить эту ошибку? Почему компилятор не распознает статический внутренний класс как статический, даже если он упоминается по его полному имени?
Ваша помощь будет принята с благодарностью.
==========
РЕДАКТИРОВАТЬ: Кроличья нора углубляется. После дальнейшего расследования я обнаружил, что проблема вызвана одной строкой кода в одной из библиотек, которые мне нужны на моем пути. У меня есть доступ к исходному коду этой библиотеки, но я не компилирую ее как часть своего проекта. Эта строка кода (скажем, в классе TheyClass) делает именно то, что я пытаюсь сделать; то есть создание экземпляра x.y.z.DesiredClass. Если я удалю эту строку кода в TheyClass (но не в MyClass), я не получу ошибку компиляции.
Итак, Таким образом, следующее не работает:
MyClass.java:
Код: Выделить всё
x.y.z.Parent.DesiredClass dc;
dc = new x.y.z.Parent.DesiredClass();
Код: Выделить всё
x.y.z.Parent.DesiredClass dc;
dc = new x.y.z.Parent.DesiredClass();
MyClass.java:
Код: Выделить всё
x.y.z.Parent.DesiredClass dc;
dc = new x.y.z.Parent.DesiredClass();
Код: Выделить всё
//x.y.z.Parent.DesiredClass dc;
//dc = new x.y.z.Parent.DesiredClass();
Подробнее здесь: https://stackoverflow.com/questions/173 ... nner-class