为什么不是普通类中的原始类型,静态变量?

时间:2013-10-18 02:54:48

标签: java generics

为什么不是泛型类型,泛型类中的静态变量?

示例,

  public class MyType<E> {
    class Inner { }
    static class Nested { }

    public static void main(String[] args) {
        MyType mt;          // warning: MyType is a raw type
        MyType.Inner inn;   // warning: MyType.Inner is a raw type

        MyType.Nested nest; // no warning: not parameterized type
        MyType<Object> mt1; // no warning: type parameter given
        MyType<?> mt2;      // no warning: type parameter given (wildcard OK!)
    }
}

MyType是通用类,Nestedstatic类。

调用MyType.Inner,而不是警告泛型类型。

我想知道为什么static变量不警告原始类型?

3 个答案:

答案 0 :(得分:4)

“在以下任何地方引用泛型类C的类型参数是编译时错误:

  • C的静态成员的声明(§8.3.1.1,§8.4.3.2,§8.5.1)“。

8.5.1指的是静态嵌套类。

(JLS§8.1.2)(http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.2

因此,静态嵌套类不会,也不能从外部类中获得与之关联的任何通用信息,因此没有关于它的缺席的警告。

答案 1 :(得分:2)

因为静态嵌套类Nested未与MyType的任何特定实例相关联。泛型类型(仅在编译时)应用于您创建MyType的实例,并且由于Inner与此类实例相关联,因此它可以引用泛型参数E,但是Nested没有这种联系。

答案 2 :(得分:0)

由于类型擦除,Java泛型只能应用于对类实例的引用。

因此,在嵌套静态类中根本不会继承泛型参数。