繁体   English   中英

为什么自动拳击工作在日食而不是在javac?

[英]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 

我看过javac选项,我认为没有办法改变这种行为。

我要推断,差异是由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

附录:

  1. Eclipse使用标准JDK,其中javac是其中的一部分。

  2. 部分差异可以通过Eclipse内部使用(其他语言有时称为“pragma”)来解释,例如@sSuppressWarnings。

  3. 然而,MAIN的不同之处在于Eclipse使用JDT库,这些库位于javac可执行文件之下。

  4. 这是一个很好的讨论:

'希望有所帮助.. PSM

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM