4

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

例子,

  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变量没有警告原始类型?

4

3 回答 3

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

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

于 2013-10-18T03:26:57.963 回答
2

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

于 2013-10-18T03:01:23.173 回答
0

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

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

于 2013-10-18T02:59:16.787 回答