我正在从一本书中学习Java泛型。书中说“类类型变量在静态上下文中无效”并用以下示例进行了解释。
考虑一个具有类型变量的泛型类,例如 Entry。不能将类型变量 K 和 V 与静态变量或方法一起使用。例如,以下内容不起作用:
public class Entry<K, V> {
// Compiler error - V in static context ("Entry.this' cannot be referenced from a static context")
private static V defaultValue;
// Compiler error - V in static context ("Entry.this' cannot be referenced from a static context")
public static void setDefault(V value) {
defaultValue = value;
}
}
Run Code Online (Sandbox Code Playgroud)
毕竟,类型擦除意味着擦除的 Entry 类中只有一个这样的变量或方法,而不是每个 K 和 V 都有一个这样的变量或方法。
我不明白上面的解释。我也尝试为 K 创建相同的代码,但得到了相同的编译错误。为什么上面的代码是非法的?
让我们假设static变量确实按照您描述的方式工作......
我本来能够做到:
Entry<String, Integer>.defaultValue = 1;
Entry<String, String>.defaultValue = "Hello";
System.out.println(Entry<String, Integer>.defaultValue); // 1
System.out.println(Entry<String, String>.defaultValue); // Hello
Run Code Online (Sandbox Code Playgroud)
这就是你所期望的,不是吗?
但请记住,每个类static都有一个变量。由于类型擦除,和被视为同一类。对于上面的代码来说,工作需要存储在两个不同的地方(两个变量)!Entry<String, Integer>Entry<String, String>1"Hello"