[英]Why does automatic boxing work in eclipse but not in javac?
这段代码:
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来挖掘它并不完全是直截了当的。
javac
没有做什么,不是自动装箱,而是自动演员。 在javac
它编译为:
Integer ints[] = new Integer[] { (int) '1', (int) '2', (int) '3' };
只有一个Integer
javac
发生同样的情况,再次在javac
,我要进行显式转换来编译:
Integer a = (int) '1';
但这是我发现的。 即使没有强制转换,从命令行使用Eclipse JDT批处理编译器也可以工作:
$ java -jar org.eclipse.jdt.core_3.7.1.v_B76_R37x.jar -classpath rt.jar \
-1.6 Appo.java
我要推断,差异是由Eclipse不在内部使用javac
,而是由JDT编译器引起的 。
正如stivlo已经注意到的那样 ,Eclipse JDT编译器默默地处理这样的代码:
Integer refI = Integer.valueOf((int)'a');
但Java语言规范在第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)
转换是第一次转换, Integer.valueOf(int)
是第二次转换。 javac
编译器只允许一次转换来强制执行规则。
所以看来,你在Eclipse JDT编译器中发现了一个错误。
我在这个线程上发现了很多关于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
窗口 - >首选项 - >编译器 - >错误/警告 - >潜在的编程问题 - >装箱和拆箱转换; 将值设置为Error
可能是-source标志设置为Java的自动装箱版本? 例如
javac -source 1.4 BoxTest.java
实际上,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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.