我有一些类似的代码:
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作为Object返回。我知道它是一个布尔值,当我用A / B java文件包含C并一次编译时,它工作正常。
但是当我将A / B单独编译为C时,我得到的结论是它认为var.getValue是一个Object。
我一直在阅读关于泛型和类型擦除的内容,但我找不到解决方法。
我正在尝试将A / B构建为像C一样使用类的包,但如果我必须强制转换所有getValues,那么泛型就没有意义了。
我哪里错了?
(实际代码在this github repo中,A和B的违规类是ModOption / ModBooleanOption。我没有C代码,但很明显)
编辑:我正在使用JavaSE6编译和混淆。奇怪的是,如果我定期编译然后尝试这个例子也可以正常工作。我开始怀疑混淆器。
这个问题解决了;我进一步测试并发现混淆器打破了泛型,我不知道怎么也不关心为什么。我会联系它的维护者。
答案 0 :(得分:2)
我能够通过在编译C时将编译器设置为javac -source 1.4
来重现此 。如果您使用的是IDE,请检查包含C的项目以确保您的Java VM和源支持为1.5或更高。