3

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

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

4

1 回答 1

2

Java 语言规范 4.8

未从其超类或超接口继承的原始类型 C 的构造函数(第 8.8 节)、实例方法(第 8.4 节、第 9.4 节)或非静态字段(第 8.3 节)的类型是对应的原始类型在对应于 C 的泛型声明中擦除其类型。

这意味着原始类型的所有泛型成员(= 没有类型参数的泛型)都被视为原始类型。

您可以修复您的示例:

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>();
}
于 2013-06-27T10:56:38.960 回答