Компилятор Java не распознает статический внутренний классJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Компилятор Java не распознает статический внутренний класс

Сообщение Anonymous »

Это довольно сложная ошибка, поэтому будьте терпеливы.

Я вижу странную ошибку при попытке скомпилировать 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();
^
Важно отметить, что классы, на которые имеются ссылки, были скомпилированы разными компиляторами Java:
  • предназначен для компиляции с помощью Sun Java 1.4.2_18
  • Код: Выделить всё

    x.y.z.Parent.DesiredClass
    и other DesiredClass были скомпилированы с использованием Microsoft Java.
Опять же, к сожалению, эти классы невозможно перекомпилировать с помощью более современных версий Java.

Кроме того, при попытке компиляции с помощью 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.
Если я компилирую более новую версию Java (1.5 и выше), исключение компилятора не возникает, но вышеупомянутая ошибка все равно возникает.

Кто-нибудь может объяснить эту ошибку? Почему компилятор не распознает статический внутренний класс как статический, даже если он упоминается по его полному имени?

Ваша помощь будет принята с благодарностью.
==========

РЕДАКТИРОВАТЬ: Кроличья нора углубляется. После дальнейшего расследования я обнаружил, что проблема вызвана одной строкой кода в одной из библиотек, которые мне нужны на моем пути. У меня есть доступ к исходному коду этой библиотеки, но я не компилирую ее как часть своего проекта. Эта строка кода (скажем, в классе TheyClass) делает именно то, что я пытаюсь сделать; то есть создание экземпляра x.y.z.DesiredClass. Если я удалю эту строку кода в TheyClass (но не в MyClass), я не получу ошибку компиляции.

Итак, Таким образом, следующее не работает:

MyClass.java:

Код: Выделить всё

x.y.z.Parent.DesiredClass dc;
dc = new x.y.z.Parent.DesiredClass();
ИхКласс.java:

Код: Выделить всё

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();
ИхКласс.java[/b]:

Код: Выделить всё

//x.y.z.Parent.DesiredClass dc;
//dc = new x.y.z.Parent.DesiredClass();
Я постараюсь последовать совету @Richard и минимизировать код, чтобы опубликовать его образец.

Подробнее здесь: https://stackoverflow.com/questions/173 ... nner-class
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Внутренний класс Java и статический вложенный класс – двоичный дифф
    Anonymous » » в форуме JAVA
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Использует ли hibernate внутренний jdbc или внутренний JTA, или его можно настроить?
    Anonymous » » в форуме JAVA
    0 Ответы
    48 Просмотры
    Последнее сообщение Anonymous
  • Когда я вызываю поток(), где находится внутренний итератор или внутренний сплиттератор?
    Anonymous » » в форуме JAVA
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Когда я вызываю поток(), где находится внутренний итератор или внутренний сплиттератор?
    Anonymous » » в форуме JAVA
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • Компилятор C++ не распознает «класс» в заголовочном файле [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»