继承而不指定父类的泛型类型时,不兼容的类型错误

时间:2013-06-27 10:13:23

标签: java generics types

这是关于一个令人费解的“不兼容类型”错误,它是在经过一些小修改后编译下面的代码时产生的。

这是一个极简主义类的内容,它在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

1 个答案:

答案 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>();
}