泛型问题 - 无法编译代码,可能是由于类型擦除

时间:2011-05-16 03:22:08

标签: java compiler-errors type-erasure

我有一些类似的代码:

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编译和混淆。奇怪的是,如果我定期编译然后尝试这个例子也可以正常工作。我开始怀疑混淆器。

这个问题解决了;我进一步测试并发现混淆器打破了泛型,我不知道怎么也不关心为什么。我会联系它的维护者。

1 个答案:

答案 0 :(得分:2)

我能够通过在编译C时将编译器设置为javac -source 1.4来重现此 。如果您使用的是IDE,请检查包含C的项目以确保您的Java VM和源支持为1.5或更高。