У меня есть код, похожий на этот:
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 компиляции и запутывания.Странная вещь в том, что если я регулярно компилирую, а затем пробую этот пример, это тоже хорошо работает.Я начинаю подозревать обфускатор.
Эта проблема решена;Я проверил дальше и обнаружил, что обфускатор ломает дженерики, я понятия не имею, как и мне все равно, почему.Я свяжусь с его сопровождающими.