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

标签 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 作为对象返回。我知道它是一个 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/

相关文章:

java - 将从文件中读取的数据放入记录中

java - 如何从平面 SQL 选择结果集创建嵌套映射

c++ - 重载运算符+编译错误 '' 没有匹配的函数调用.. .''

cocoa - 避免 "[superclass] may not respond to [selector]"警告,而不会引发 LLVM 的 "Cannot cast ' super'"错误

java - GWT - 无法找到入口点类

java - 为什么 Java 在运行时不会删除所有类型信息?

java - 通过遍历枚举来分配参数

javascript - undertow 路径模板和资源处理程序

Java 泛型、对象和通配符的差异和说明

java - 在 Java 5 中实现 ListeningExecutorService