Проблема Generics - Невозможно скомпилировать код, возможно, из-за стирания типа - PullRequest
1 голос
/ 16 мая 2011

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

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 отдельно для CI, возникает проблема, что он считает var.getValue объектом.

Я читал об обобщениях и типе Erasure, но не смог 'Я не могу решить эту проблему.

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

Куда я иду не так?

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

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

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

1 Ответ

2 голосов
/ 16 мая 2011

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

...