使用没有类型的 Java 泛型 - 泛型擦除?

Phy*_*ess 3 java generics

看看这个方法:

public class Outer<E> {
    public static class Inner{
        public E value;
        public Inner(E value){
            this.value = value;
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

我们将使用以下代码使用它:

Outer.Inner i = new Outer.Inner(5);
System.out.println(i.value);
Run Code Online (Sandbox Code Playgroud)

这个东西不会编译,因为在内部方法中使用了 E。

我的问题是 - 我知道在编译时所有泛型都被删除并替换为 Object。那么为什么这里不是这种情况呢?E 将被 Object 替换,这整个事情应该编译。

这是否意味着我们永远不能使用没有类型的泛型类?(我知道这是不好的做法,但我认为这应该有效)

谢谢。

Swe*_*per 5

这与类型擦除无关。这仅仅是因为您不能在任何静态声明中使用类型参数。正如Java 语言规范所说:

在以下任何一种情况下引用泛型类 C 的类型参数都是编译时错误:

  • C 静态成员的声明(第 8.3.1.1 节、第 8.4.3.2 节、第 8.5.1 节)。

  • 嵌套在 C 中的任何类型声明的静态成员的声明。

  • C 的静态初始值设定项(第 8.7 节),或

  • 嵌套在 C 中的任何类声明的静态初始值设定项。

第一点在这里适用。

所以即使这样也不会编译:

class Foo<T> {
    public static void f(T param) {}
}
Run Code Online (Sandbox Code Playgroud)