我最近从Netbeans切换到Eclipse,Eclipse在我的Project中发现了许多Netbeans没有的语法错误,我不知道为什么。据了解,这两个IDE都设置为使用java1.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中的某个地方有配置设置?
看起来自动装箱被禁用了。检查Window->Preferences->Java->Compiler->Errors/Warnings Boxing and unboxing conversion是否未设置为Error。还要检查Window->Preferences->Java->Installed JRE是否使用至少1.5的JDK\JRE。
您可以在窗口->首选项->Java->编译器->错误/警告下设置编译器警告。
还要确保您是根据正确的Java版本进行编译的(检查1.6 Java是否在构建路径中,并检查JDK Compilance级别,请参阅Preferences->Java->Compiler)
将声明更改为
Map<Integer,Integer> map;
map = new Hashtable<Integer,Integer>();
这将解决你的问题。
或者,您可以更改此行
assertTrue(Integer.valueOf(number) == map.get(status));
将Integer与==进行比较不是一个好做法。它只是偶尔工作。您确实应该使用equals()。
我不知道为什么在你们的情况下自动装箱并没有自动发生,也许有人更了解规范可以提供答案。
附言:最好将此更改为
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));
(我甚至会在map.get(status)
的结果所在定义Integer类型的临时变量,但是否这样做是风格的问题;这将有助于编译器)。这里没有使用新的功能。
为什么你对Netbeans没有意见?我的猜测是因为您的JRE版本(或供应商)或您的项目设置。