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

时间:2011-10-27 15:14:42

标签: java eclipse

此代码:

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挖掘它并不是很直接。

6 个答案:

答案 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

附录:

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

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

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

  4. 以下是一次精彩的讨论:

  5. '希望有所帮助.. PSM