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