【发布时间】:2012-09-27 01:40:43
【问题描述】:
为什么以下不编译?编译器对打印行中的+ 符号给出错误。
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> 允许编译,但我不明白为什么这不能正常工作。
这是编译器错误还是这种行为背后有什么逻辑?
【问题讨论】:
-
什么是
Test,test1也是HashMap<Integer,Integer>? -
你确定你有这个例子吗?
main方法没有引用m,也没有引用T。您得到的确切编译错误是什么......以及在哪里? -
糟糕,复制粘贴错误。现已修复。
-
如果我可以问,为什么不呢?这在 Java 编译器中似乎是意料之外的行为。如果是,那么我想在提交错误报告之前得到专家的确认。如果不是,那么我想知道编译器为什么会这样。在您看来,是什么让这个问题比其他问题更不有趣?
-
+1。这很迷人。当我运行
javac -Xlint:unchecked Test.java时,我收到警告说对put的调用未选中。由于某种原因,当t属于原始类型Test时,编译器会将t.m视为属于原始类型HashMap。
标签: java generics compiler-errors