[英]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相对),非静态字段M
是m
。 作为上述规则的结果, 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.