为什么泛型类中不能使用原始类型和静态变量?

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 是一个泛型类,而 Nested 是一个静态类。

调用 MyType.Inner 时不会警告泛型类型。

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


尝试使用 MyType<?>.Nested nest2;,你会得到编译错误:“error: cannot select a static class from a parameterized type”。 - user207421
3个回答

4
"在泛型类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)"
"因此,静态嵌套类不会从外部类继承任何泛型信息,因此没有关于其缺失的警告。"

2

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


+1 你能否提供JLS参考或任何其他详细解释此工作方式的参考资料。 - Narendra Pathai
@NarendraPathai 请查看EJP的回答。 - chrylis -cautiouslyoptimistic-

0
由于类型擦除,Java 泛型只能应用于类的实例的引用。
因此,在嵌套的静态类中,泛型参数根本不会被继承。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接