Почему этот метод с циклическими дженериками в сигнатуре не компилируется? ⇐ JAVA
Почему этот метод с циклическими дженериками в сигнатуре не компилируется?
Я создал следующий метод, который использует в своей сигнатуре циклические универсальные типы.
private U createNameTranslationInstance(T родительский, Language targetLanguage, Строка переведенноеИмя, Строка переведенноеAutoSuggestionText) { if (родительский экземпляр организма организма) { return (U) new OrganismCommonNameTranslation(organism, targetLanguage, переведенное имя, GardenerPlanet, переведенныйAutoSuggestionText, SubmissionStatus.APPROVED); } else if (родительский экземпляр LifeStage lifeStage) { return (U) new LifeStageCommonNameTranslation(lifeStage, targetLanguage, переведенное имя, GardenerPlanet, переведенныйAutoSuggestionText, SubmissionStatus.APPROVED); } throw new IllegalArgumentException("Неподдерживаемый родительский тип: " +parent.getClass().getName()); } Этот метод возвращает объект типа U, который расширяет абстрактный класс NameTranslation с помощью универсального типа T, а также реализует интерфейс Autocompletable. Универсальный тип T — это тип, который расширяет интерфейс Polyonymous универсальным типом U.
Когда я попытаюсь скомпилировать это, он выдаст пару ошибок компилятора Java для этого метода.
java: несовместимые типы: T невозможно преобразовать в POJO.TaxonomicPojos.Organism Java: несовместимые типы: POJOs.TaxonomicPojos.categorytranslations.OrganismCommonNameTranslation невозможно преобразовать в U java: несовместимые типы: T невозможно преобразовать в POJOs.TaxonomicPojos.LifeStage Java: несовместимые типы: POJOs.TaxonomicPojos.categorytranslations.LifeStageCommonNameTranslation невозможно преобразовать в U Но и Organism, и LifeStage расширяют Polyonymous и связанные с ним классы CommonNameTranslation, каждый расширяет NameTranslation и реализует AutoCompletable.
Когда я удаляю extends Polyonymous и тем самым удаляю циклическую ссылку, все снова компилируется. Я погуглил, чтобы узнать, разрешены ли в Java круговые общие зависимости. Но согласно этому ответу SO циклические дженерики вполне допустимы.
Это становится еще более странным, когда я удаляю & Autocompletable из сигнатуры метода вместо части extends Polyonymous. Теперь этот метод вместо этого вызывает внутреннюю ошибку компилятора Java.
java: Ошибка компиляции: внутренняя ошибка компилятора Java Ошибка этого типа может возникнуть по разным причинам, включая неправильный синтаксис в коде, неправильное использование конструкций языка Java, проблемы с памятью или дисковым пространством или ошибки в самом компиляторе Java (источник).
>
Так что же такого в этой универсальной сигнатуре, которая вызывает проблемы с компиляцией?
Вот все определения классов
публичный класс Organism реализует Polyonymous{ } публичный класс LifeStage реализует Polyonymous{ } публичный класс OrganismCommonNameTranslation расширяет NameTranslation реализует Autocompletable { } публичный класс LifeStageCommonNameTranslation расширяет NameTranslation реализует автозаполнение { } общедоступный абстрактный класс NameTranslation{} общедоступный интерфейс Polyonymous{} общедоступный интерфейс РЕДАКТИРОВАТЬ: вот информация о моей версии Java
openjdk 20.0.2.1 22 августа 2023 г. Среда выполнения OpenJDK Corretto-20.0.2.10.1 (сборка 20.0.2.1+10-FR) 64-битная серверная виртуальная машина OpenJDK Corretto-20.0.2.10.1 (сборка 20.0.2.1+10-FR, смешанный режим, общий доступ) РЕДАКТИРОВАТЬ 12.07.2023
Внутренняя ошибка Java, по-видимому, вызвана явным приведением к (U) в сочетании с циклическими универсальными ссылками.
Я создал следующий метод, который использует в своей сигнатуре циклические универсальные типы.
private U createNameTranslationInstance(T родительский, Language targetLanguage, Строка переведенноеИмя, Строка переведенноеAutoSuggestionText) { if (родительский экземпляр организма организма) { return (U) new OrganismCommonNameTranslation(organism, targetLanguage, переведенное имя, GardenerPlanet, переведенныйAutoSuggestionText, SubmissionStatus.APPROVED); } else if (родительский экземпляр LifeStage lifeStage) { return (U) new LifeStageCommonNameTranslation(lifeStage, targetLanguage, переведенное имя, GardenerPlanet, переведенныйAutoSuggestionText, SubmissionStatus.APPROVED); } throw new IllegalArgumentException("Неподдерживаемый родительский тип: " +parent.getClass().getName()); } Этот метод возвращает объект типа U, который расширяет абстрактный класс NameTranslation с помощью универсального типа T, а также реализует интерфейс Autocompletable. Универсальный тип T — это тип, который расширяет интерфейс Polyonymous универсальным типом U.
Когда я попытаюсь скомпилировать это, он выдаст пару ошибок компилятора Java для этого метода.
java: несовместимые типы: T невозможно преобразовать в POJO.TaxonomicPojos.Organism Java: несовместимые типы: POJOs.TaxonomicPojos.categorytranslations.OrganismCommonNameTranslation невозможно преобразовать в U java: несовместимые типы: T невозможно преобразовать в POJOs.TaxonomicPojos.LifeStage Java: несовместимые типы: POJOs.TaxonomicPojos.categorytranslations.LifeStageCommonNameTranslation невозможно преобразовать в U Но и Organism, и LifeStage расширяют Polyonymous и связанные с ним классы CommonNameTranslation, каждый расширяет NameTranslation и реализует AutoCompletable.
Когда я удаляю extends Polyonymous и тем самым удаляю циклическую ссылку, все снова компилируется. Я погуглил, чтобы узнать, разрешены ли в Java круговые общие зависимости. Но согласно этому ответу SO циклические дженерики вполне допустимы.
Это становится еще более странным, когда я удаляю & Autocompletable из сигнатуры метода вместо части extends Polyonymous. Теперь этот метод вместо этого вызывает внутреннюю ошибку компилятора Java.
java: Ошибка компиляции: внутренняя ошибка компилятора Java Ошибка этого типа может возникнуть по разным причинам, включая неправильный синтаксис в коде, неправильное использование конструкций языка Java, проблемы с памятью или дисковым пространством или ошибки в самом компиляторе Java (источник).
>
Так что же такого в этой универсальной сигнатуре, которая вызывает проблемы с компиляцией?
Вот все определения классов
публичный класс Organism реализует Polyonymous{ } публичный класс LifeStage реализует Polyonymous{ } публичный класс OrganismCommonNameTranslation расширяет NameTranslation реализует Autocompletable { } публичный класс LifeStageCommonNameTranslation расширяет NameTranslation реализует автозаполнение { } общедоступный абстрактный класс NameTranslation{} общедоступный интерфейс Polyonymous{} общедоступный интерфейс РЕДАКТИРОВАТЬ: вот информация о моей версии Java
openjdk 20.0.2.1 22 августа 2023 г. Среда выполнения OpenJDK Corretto-20.0.2.10.1 (сборка 20.0.2.1+10-FR) 64-битная серверная виртуальная машина OpenJDK Corretto-20.0.2.10.1 (сборка 20.0.2.1+10-FR, смешанный режим, общий доступ) РЕДАКТИРОВАТЬ 12.07.2023
Внутренняя ошибка Java, по-видимому, вызвана явным приведением к (U) в сочетании с циклическими универсальными ссылками.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему несоответствие типов компилируется и работает с дженериками и итераторами Java?
Anonymous » » в форуме JAVA - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-