看看这个方法:
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 替换,这整个事情应该编译。
这是否意味着我们永远不能使用没有类型的泛型类?(我知道这是不好的做法,但我认为这应该有效)
谢谢。
这与类型擦除无关。这仅仅是因为您不能在任何静态声明中使用类型参数。正如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)