Проблема дженериков — невозможно скомпилировать код, возможно, из-за стирания типа

У меня есть код, похожий на этот:

public class A<E> {
     protected E value;

     public E getValue() { 
         return value;
     }

     public void setValue(E value) {
         this.value = value;
     }
}

Затем у меня есть класс для расширения этого класса, называемый B

public class B extends A<Boolean> {
     // B has some other code, but doesn't edit the set/get methods
}

Затем я компилирую эти два класса в A.class, B.class, и они JARed.

Тогда у меня есть следующий код:

public class C {
// ... snip
     B var = new B();
     var.setValue(true);
     if(var.getValue()) {
         // etc
     }
// ... snip
}

Попытка скомпилировать это приводит к ошибке, сообщающей мне, что var.getValue возвращается как объект. Я ЗНАЮ, что это логическое значение, и когда я включаю этот C с java-файлами A/B и компилирую все сразу, он работает нормально.

Но когда я компилирую A/B отдельно в C, у меня возникает проблема, что он считает, что var.getValue является объектом.

Я читал об дженериках и Type Erasure, но не мог найти способ решить эту проблему.

Я пытаюсь встроить A/B в пакет, который используют такие классы, как C, но если мне нужно привести все getValues, то нет смысла в дженериках.

Где я ошибаюсь?

(Фактический код находится в этом репозитории github, а классы-нарушители, которые A и B — это ModOption/ModBooleanOption, у меня там нет кода C, но это очевидно)

Изменить: я использую компиляцию и запутывание JavaSE6. Странно то, что если я регулярно компилирую, а затем пробую этот пример, он тоже работает нормально. Я начинаю подозревать обфускатор.

Эта проблема решена; Я проверил дальше и обнаружил, что обфускатор ломает дженерики, я понятия не имею, как, и мне все равно, почему. Я свяжусь с его сопровождающими.


person Clintonio    schedule 16.05.2011    source источник
comment
Какой SDK вы используете? Ваш пример отлично компилируется для меня (отдельно или вместе) с использованием jdk1.6.0_25.   -  person jkraybill    schedule 16.05.2011
comment
@jkraybill Java SDK 6. В производственной версии код работает с обфускатором (не мой выбор), и это единственная разница.   -  person Clintonio    schedule 16.05.2011
comment
Просто из любопытства, поскольку проблема в обфускаторе, не могли бы вы поделиться, какой из них вы используете?   -  person Ted Hopp    schedule 01.06.2011


Ответы (1)


Мне удалось воспроизвести это только, установив для моего компилятора значение javac -source 1.4 во время компиляции C. Если вы используете IDE, проверьте проект, содержащий C, чтобы убедиться, что ваша виртуальная машина Java и исходный код поддерживаются на уровне 1.5. или выше.

person Dan    schedule 16.05.2011
comment
Java SDK 6. В рабочей версии код работает с обфускатором (не мой выбор), и это единственное отличие. - person Clintonio; 16.05.2011
comment
Оказывается, обфускатор был древним. Владельцы не будут обновляться. Оказывается, я должен отказаться от этого и просто не использовать дженерики. - person Clintonio; 22.06.2011