在未指定类型的情况下继承泛型类时无法识别的通用父字段

时间:2015-02-11 14:01:57

标签: java generics

为什么在没有指定类型的情况下对泛型类进行子类化父类的每个其他泛型类型都被视为子类中的普通类型?

例如,以下错误是因为 s 不是 Map<整数,字符串> ,但是一个普通的地图

class Foo<T> {
    protected Map<Integer, String> s;
}

class Bar extends Foo {
    public Bar() {
        s.get(0).length();
    }
}

当然,如果 Bar延伸Foo&lt;无论&gt; 错误消失了。

1 个答案:

答案 0 :(得分:4)

Java Language specification, Section §4.8

  

类的超类型可以是原始类型。该类的成员访问被视为正常,超类型的成员访问被视为原始类型。在类的构造函数中,对super的调用被视为原始类型的方法调用。

您正在访问原始类型的成员,因此所有成员访问也被视为原始类型。这就是你得到编译时错误的原因:

  

类型length()

的方法Object未定义