Как использовать дженерики в мире смешанных версий Java?
-
10-07-2019 - |
Вопрос
Я очень люблю дженерики и использую их везде, где могу. Время от времени мне нужно использовать один из моих классов в другом проекте, который должен работать на старой JVM (до 5.0), должен работать на JavaME (где не разрешены ни универсальные шаблоны), ни в Microsoft J # (где ОЧЕНЬ плохо Поддержка дженериков).
В настоящий момент я удаляю все дженерики вручную, что также означает вставку множества приведений.
Поскольку говорят, что обобщенные элементы предназначены только для времени компиляции, и каждый фрагмент обобщенного кода может автоматически преобразовываться в неуниверсальный код, мне интересно, существует ли какой-либо инструмент, который может сделать это для меня.
Если такого инструмента нет, как еще можно решить проблему? Должен ли я полностью прекратить использование дженериков?
Уже есть ответы, связанные с совместимостью байт-кода . Что если мне по какой-то причине понадобится совместимость исходного кода ?
Решение
Вам нужно использовать что-то вроде Retroweaver , чтобы добиться такого рода вещей. Другие ответы на этот вопрос немного вводят в заблуждение. Обобщения являются своего рода байт-кодом, совместимым с предыдущими версиями, но не полностью (см. java.lang.reflect.Type
, если вы мне не верите). Кроме того, существует проблема с атрибутом версии байт-кода, который препятствует запуску класса, скомпилированного для версии 1.5, в предыдущей версии. Retroweaver решает обе проблемы, а также включает другие функции Java 5, такие как аннотации и перечисления.
Другие советы
В Netbeans (я не уверен в том, какую IDE вы используете) вы можете установить совместимость исходного кода с установленной версией Java - просто установите ту, которая поддерживает дженерики. Как уже сообщалось, дженерики совместимы со старыми версиями JVM / JRE, поэтому мы надеемся, что они будут работать «из коробки».
Насколько мне известно, Java 5 не байт-код совместим с Java 1.4. То есть вы не можете использовать скомпилированные классы Java 5 с более ранней виртуальной машиной. Р>
Вы можете проверить ретро-ткач. Об этом много говорилось, когда были представлены дженерики. У меня лично нет никакого опыта с этим.
Вы спрашивали Google? Мой поиск обнаружил Generics_and_Java_1.4_with_one_codebase.pdf , что кажется очень интересным подходом.
Его байт-код совместим, он должен работать из коробки со старым интерпретатором.