我有一些与此类似的代码:
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 作为对象返回。我知道它是一个 boolean 值,当我将 C 包含在 A/B java 文件中并立即编译时,它工作得很好。
但是当我将 A/B 单独编译为 C 时,我遇到了一个问题,它认为 var.getValue 是一个对象。
我一直在阅读有关泛型和类型删除的内容,但我找不到解决它的方法。
我正在尝试将 A/B 构建到 C 等类使用的包中,但如果我必须强制转换所有 getValues,那么泛型就没有意义了。
我哪里出错了?
(实际代码在 this github repo 中,A 和 B 的违规类是 ModOption/ModBooleanOption。我在那里没有 C 代码,但很明显)
编辑:我正在使用 JavaSE6 编译和混淆。奇怪的是,如果我定期编译然后尝试这个示例也可以正常工作。我开始怀疑混淆器。
这个问题已经解决了;我进一步测试并发现混淆器正在破坏泛型,我不知道如何破坏也不关心为什么。我将联系它的维护者。
最佳答案
在编译 C 时,我只能通过将编译器设置为 javac -source 1.4
来重现此问题。如果您使用的是 IDE,请检查包含以下内容的项目: C 确保您的 Java VM 和源支持为 1.5 或更高版本。
关于java - 泛型问题 - 无法编译代码,可能是由于类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6012893/