我最近从Netbeans切换到了Eclipse,Eclipse在我的项目批次中发现了Netbeans没有的语法错误,我无法弄清楚原因。据我们所知,两个IDE都设置为使用java 1.6。这个问题的一个例子如下(这实际上是可怕的代码,但我正在处理遗留的东西):
Map map;
map = new Hashtable();
... add some stuff to map
int number = 5;
int status = 7;
assertTrue(number == map.get(status));
上面回到“不兼容的操作数类型int和Object”,而Netbeans根本没有抱怨。我实际上并不遵循为什么这不起作用(int对象不会被自动装箱到Integer?),因为它在Netbeans的运行时工作。我假设在eclipse的某个地方有配置设置?
答案 0 :(得分:3)
看起来禁用了自动装箱。检查Window-> Preferences-> Java-> Compiler->错误/警告Boxing和拆箱转换未设置为Error。另请检查Window-> Preferences-> Java-> Installed JRE是否使用至少为1.5的JDK \ JRE。
答案 1 :(得分:1)
您可以在Window-> Preferences-> Java-> Compiler-> Errors / Warnings下设置编译器警告。
确保您正在编译正确的Java版本(检查您的1.6 Java是否在构建路径中并检查JDK Compilance级别,请参阅Preferences-> Java-> Compiler)
答案 2 :(得分:0)
将声明更改为
Map<Integer,Integer> map;
map = new Hashtable<Integer,Integer>();
这将解决您的问题。
或者,您可以更改此行
assertTrue(Integer.valueOf(number) == map.get(status));
将整数与==进行比较并不是一种好习惯。它只是偶尔工作。你真的应该使用equals()。
我不知道为什么你的情况下自动装箱不会自动发生,也许知道规格更好的人可以提供答案。
P.S。更好的是将其更改为
assertEquals(number, map.get(status));
这将按预期工作。
在澄清它是遗留代码后,我的建议如下。将您的代码更改为:
Map map;
map = new Hashtable();
... add some stuff to map
Integer number = Integer.valueOf(5);
Integer status = Integer.valueOf(7);
assertEquals(number, map.get(status));
(我甚至会定义Integer类型的临时变量,其中我放置了map.get(status)
的结果,但它是否是要执行此操作的样式的问题;这将有助于编译器)。此处,未使用新功能。
为什么你没有Netbeans的问题?我的猜测是因为您的JRE(或供应商)版本或您的项目设置。