此代码:
Integer ints[] = new Integer[]{'1', '2', '3'};
在eclipse中编译得很好,但是javac(版本1.6.0_27和1.7.0)都会出现以下错误:
BoxTest.java:4: incompatible types
found : char
required: java.lang.Integer
Integer ints[] = new Integer[]{'1', '2', '3'};
BoxTest.java:4: incompatible types
为什么?
我认为它是某种编译器标志,但是通过eclipse挖掘它并不是很直接。
答案 0 :(得分:6)
javac
没有做什么,不是自动装箱,而是自动投射。在javac
中,它编译为:
Integer ints[] = new Integer[] { (int) '1', (int) '2', (int) '3' };
只有一个Integer
同样发生,再次在javac
中,我要进行显式转换以进行编译:
Integer a = (int) '1';
但这是我发现的。即使没有强制转换,也可以从命令行使用Eclipse JDT batch compiler:
$ java -jar org.eclipse.jdt.core_3.7.1.v_B76_R37x.jar -classpath rt.jar \
-1.6 Appo.java
我查看了options of javac
,我认为没有办法改变这种行为。
我要推断,差异是由于 Eclipse内部没有使用javac
,而是JDT编译器。
答案 1 :(得分:4)
正如 stivlo 已经提到的那样,Eclipse JDT编译器默默地处理这样的代码:
Integer refI = Integer.valueOf((int)'a');
但 Java语言规范在chapter 5.2(强调我的)中说:
当表达式的值为时,发生分配转换 已赋予(第15.26节)变量:表达式的类型必须为 转换为变量的类型。分配上下文允许 使用一个以下内容:
* an identity conversion (§5.1.1) * a widening primitive conversion (§5.1.2) * a widening reference conversion (§5.1.5) * a boxing conversion (§5.1.7) optionally followed by a widening reference conversion * an unboxing conversion (§5.1.8) optionally followed by a widening primitive conversion.
(int) 'a'
演员表是第一次转换,Integer.valueOf(int)
是第二次转换。 javac
编译器只允许一次转换来强制执行规则。
看来,您在Eclipse JDT编译器中发现了一个错误。
答案 2 :(得分:2)
我在这个线程上发现了很多关于Eclipse如何编译Java代码的困惑。这是交易 - Eclipse使用其“自己的”JDT编译器,它与Sun或Sun(现在的Oracle)的javac编译器一起无事可做。它是一个独立开发的编译器,在EPL下获得许可,并遵循JLS,就像javac一样。因此无论使用javac编译/不编译,是否使用Eclipse JDT进行编译。
那就是说,这里报告的问题看起来像Eclipse编译器中的一个错误。 https://bugs.eclipse.org/bugs/show_bug.cgi?id=362279
答案 3 :(得分:1)
窗口 - >偏好 - >编译器 - >错误/警告 - >潜在的编程问题 - >拳击和拆箱转换;将值设置为错误
答案 4 :(得分:0)
可能将-source标志设置为Java的自动装箱版本吗?例如
javac -source 1.4 BoxTest.java
答案 5 :(得分:0)
实际上,Eclipse IDE使用Java @SuppressWarnings:
http://knol.google.com/k/suppresswarnings-annotation-in-java#
来自javac的道德等价物是XList:xxx选项:
http://download.oracle.com/javase/1,5.0/docs/tooldocs/windows/javac.html#options
附录:
Eclipse使用标准JDK,其中javac是其中的一部分。
部分差异可以通过Eclipse内部使用(其他语言有时称为“pragma”)来解释,例如@sSuppressWarnings。
然而,MAIN的不同之处在于Eclipse使用JDT库,这些库位于javac可执行文件之下。
以下是一次精彩的讨论:
'希望有所帮助.. PSM