繁体   English   中英

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

[英]All HashMap type values erased in generic class?

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

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));
  }
}

我理解类型擦除,但是m是HashMap<Integer,Integer> ,它根本不应该依赖于类型<T> 为什么编译器会拒绝这个? 删除第一行中的<T>允许编译,但我不明白为什么这不应该也能正常工作。

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

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

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

在您的示例中,原始类型C是Test (与Test<Object>Test<Integer>或whatnot相对),非静态字段Mm 作为上述规则的结果, tm的类型是原始类型HashMap ,而不是HashMap<Integer, Integer> ,因此tmget(Object)的返回类型是Object而不是Integer

只需更换您的线路:

Test t = new Test();

通过:

Test<Integer> t = new Test<Integer>();

这将有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM