Класс Frame ASM не имеет универсального типа

Документация ASM (pdf) гласит, что Frame класс имеет универсальный тип, предоставляя пример использования: Frame<BasicValue>, (на стр. 119, если необходимо)

Глядя на источник, мы видим, что это объявление Frame<V extends Value>,

Но по какой-то причине, когда в моем проекте я указываю maven-зависимости,

<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>4.2</version>
</dependency>
<dependency>
     <groupId>org.ow2.asm</groupId>
     <artifactId>asm-analysis</artifactId>
     <version>4.2</version>
</dependency>

или просто загрузите соответствующие артефакты вручную из репозитория, попробуйте использовать Frame<...> заканчивается ошибкой:

Type org.objectweb.asm.tree.analysis.Frame doesn't have type parameters

А также Intellij IDEA декомпилятор говорит Frame действительно нет никого.

Та же самая проблема имеет место с Analyzer а также Interpreter классы.

Как я могу победить это?

2 ответа

Решение

В дополнение к ответу @dejvuth:

asm-debug-all имеет версию Java 5.0 и содержит все общие типы. Более того, он совместим в двоичном формате с простой библиотекой asm без обобщений

Из ASM FAQ

14. Какой самый ранний JDK требуется для использования ASM?

...

Для пакетов asm.util и asm.tree требуется JDK 1.2, ...

и история ASM 4.0 RC1

генерируется API для использования обобщений и переменных. Тем не менее, почти все банки все еще маленькие и совместимы с 1.2.

В основном, когда происходит Jarred, ASM оптимизирует байт-код, что (среди прочего) делает его обратно совместимым с 1.2, изменяя его основную версию на 46 (см. org.objectweb.asm.optimizer.ClassOptimizer).

Я предполагаю, что есть два варианта: использовать его без обобщений или скомпилировать источник самостоятельно.

Другие вопросы по тегам