这是关于一个令人费解的“不兼容类型”错误,它是在经过一些小修改后编译下面的代码时产生的。
这是一个极简主义类的内容,它在javac和IntelliJ中都没有问题编译:
public final class ChildClass extends ParentClass<Object> {
public void method() {
String value = stringList.get(0);
}
}
class ParentClass<T> {
protected final List<String> stringList = new ArrayList<String>();
}
通过删除<Object>
修改第一行后,使用javac进行编译会产生以下错误消息:
ChildClass.java:6: incompatible types
found : java.lang.Object
required: java.lang.String
String value = stringList.get(0);
^
1 error
IntelliJ编译器也会生成类似的错误消息。
即使我真的不了解修改后得到的代码,但我真的不明白为什么String列表会受到影响,尽管它不应该依赖于T
。
答案 0 :(得分:2)
Java Language Specification 4.8:
未从其超类或超接口继承的原始类型C的构造函数(第8.8节),实例方法(第8.4节,第9.4节)或非静态字段(第8.3节)M的类型是原始的类型,对应于与C对应的泛型声明中其类型的擦除。
这意味着原始类型的所有通用成员(=没有类型参数的Generic)都被视为原始成员。
您可以修复您的示例:
public final class ChildClass extends ParentClass {
public void method() {
String value = stringList.get(0);
}
}
class ParentClass<T> extends NonGenericGrandParent {
}
class NonGenericGrandParent {
protected final List<String> stringList = new ArrayList<String>();
}