泛型类中擦除了所有HashMap类型值?

use*_*929 10 java generics compiler-errors

以下为什么不编译?编译器为+打印行中的符号提供错误.

public class Test<T> {
  HashMap<Integer,Integer> m = new HashMap<Integer, Integer>();
  public static void main(String[] args) {
    Integer zero1 = 0;
    Integer zero2 = 0;
    Test t = new Test();
    t.m.put(1,zero1);
    t.m.put(2,zero2);
    System.out.println(t.m.get(1)+t.m.get(2)==t.m.get(2));
  }
}
Run Code Online (Sandbox Code Playgroud)

我理解类型擦除,但m是a HashMap<Integer,Integer>,它根本不应该取决于类型<T>.为什么编译器会拒绝这个?删除<T>第一行允许编译,但我不明白为什么这不应该工作.

这是一个编译器错误还是这种行为背后有任何逻辑?

rua*_*akh 8

我没有解释原因,但行为确实似乎是正确的.§4.8Java 语言规范的 "原始类型"明确指出:

未从其超类或超接口继承的原始类型C 的构造函数(第8.8节),实例方法(第8.4节,第9.4节)或非静态字段(第8.3节)M的类型是对应于的原始类型在与C对应的泛型声明中擦除其类型

在您的示例中,原始类型C是Test(与Test<Object>或相反Test<Integer>),非静态字段Mm.由于上面的规则,类型t.m是原始类型HashMap,而不是HashMap<Integer, Integer>,所以返回类型t.m.get(Object)Object而不是Integer.