为什么自动装箱在eclipse中工作而在javac中不工作?

为什么自动装箱在eclipse中工作而在javac中不工作?,java,eclipse,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

此代码:

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来找出它并不完全是直截了当的。

可能是将-source标志设置为Java的预自动装箱版本?比如说


javac-source1.4boxtest.java

窗口->首选项->编译器->错误/警告->潜在编程问题
->装箱和拆箱转换;将值设置为Error

javac
没有执行的操作不是自动装箱,而是自动强制转换。在
javac
中,它使用以下代码进行编译:

Integer ints[] = new Integer[] { (int) '1', (int) '2', (int) '3' };
只有一个
整数
也会发生同样的情况,同样在
javac
中,我必须执行显式转换来编译:

Integer a = (int) '1';
但这是我发现的。使用命令行中的命令,即使没有强制转换,它也可以工作:

$ java -jar org.eclipse.jdt.core_3.7.1.v_B76_R37x.jar -classpath rt.jar \
  -1.6 Appo.java 
我已经看过了,我不认为有任何方法可以改变这种行为


我不得不推断,造成这种差异的原因是,Eclipse没有在内部使用
javac
,但是JDT编译器

实际上,Eclipse IDE使用了Java@SuppressWarnings:

javac的道德等价物是XList:xxx选项:

增编:

  • Eclipse使用标准JDK,javac是其中的一部分

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

  • 然而,主要的区别是Eclipse使用JDT库,它位于javac可执行文件之下

  • 下面是一个精彩的讨论:

  • “希望有帮助。。PSM

    正如stivlo所指出的那样,Eclipse JDT编译器会默默地处理代码,如下所示:

    Integer refI = Integer.valueOf((int)'a');
    
    但是Java语言规范在(我的重点)中说:

    当表达式的值为 赋值(§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'
    强制转换是第一次转换,
    整数。valueOf(int)
    是第二次转换。
    javac
    编译器通过只允许一次转换来强制执行规则


    看来,您在EclipseJDT编译器中发现了一个bug。

    我在这个线程中发现了很多关于Eclipse如何编译Java代码的困惑。交易是这样的- Eclipse使用其“自己的”JDT编译器,它与Sun或Sun(现在是Oracle)的javac编译器无关。它是一个独立开发的编译器,根据EPL授权,并遵循JLS,就像javac一样。因此,任何使用javac编译/不使用javac编译的内容,都使用eclipsejdt编译/不使用eclipsejdt编译

    也就是说,这里报告的问题看起来像Eclipse编译器中的一个bug。

    哇。这确实可以在Eclipse中编译在Eclipse中编译。它是否使用
    javac
    编译?在窗口>首选项>Java>编译器中检查您的JDK遵从性级别。它可能不是1.6或1.7。@MattBall允许在一次赋值中进行多个加宽转换/方框。
    char
    可以转换为
    int
    ,并且可以自动装箱为
    整数。这就是它起作用的原因。同意PaoloVictor的观点,这可能是Eclipse环境中使用的JDK与javac不匹配。@G_H您是否有指向某些文档的链接,这些文档说可能会出现多个框?没有,这是不同的。eclipse中的设置使自动装箱成为一个错误,但javac允许自动装箱。您完全正确。Eclipse使用(nee)Sun JDT库,而不是Sun javac编译器。我只是想澄清编译器的行为,这样人们就不必再玩猜谜游戏了:)