为什么这段代码在Java7中工作而不是在Java8中工作?

为什么这段代码在Java7中工作而不是在Java8中工作?,java,eclipse,java-8,Java,Eclipse,Java 8,我目前正在使用IDEEclipse版本:Neon.2发行版(4.6.2)和JavaVersion8Update131。 在这段代码中,IDE给出了一个错误-“类型不匹配:无法从字节转换为整数”: 但这段代码在IDEEclipse版本:Indigo Service Release 2和java版本7中正确执行。java第8版中的扩展转换机制发生了什么实质性的变化,因为我认为它与IDE版本无关?这绝对不是JDK的问题,因为在使用javac编译器的命令行上,代码对JDK 7和JDK 8抛出了相同的编译

我目前正在使用IDEEclipse版本:Neon.2发行版(4.6.2)和JavaVersion8Update131。 在这段代码中,IDE给出了一个错误-“类型不匹配:无法从字节转换为整数”:


但这段代码在IDEEclipse版本:Indigo Service Release 2和java版本7中正确执行。java第8版中的扩展转换机制发生了什么实质性的变化,因为我认为它与IDE版本无关?

这绝对不是JDK的问题,因为在使用
javac
编译器的命令行上,代码对JDK 7和JDK 8抛出了相同的编译器错误-

error: incompatible types
Integer i = (byte) 10;
            ^

事实上,我有EclipseMarsRelease4.5.0,它给了我与JDK7和8相同的编译错误。我没有较新的版本,因此没有在这些版本上进行测试,但是如果它没有在JDK 7的任何版本上抛出编译错误,那么它一定是该JDK版本的eclipse编译器的一个错误。

如果同时进行两次转换,您的分配将只起作用

  • byte
    扩展到
    int
  • int
    装箱到
    Integer
  • 显然,较旧的Eclipse版本允许这样做,但已经更改,而
    javac
    从未允许这样做(我测试了Java6到Java9)

    要了解正确的行为是什么,我们必须参考:

    5.2. 分配上下文 赋值上下文允许将表达式的值赋值(§15.26)给变量;表达式的类型必须转换为变量的类型

    分配上下文允许使用以下内容之一:

    • 身份转换(§5.1.1)
    • 扩大原语转换(§5.1.2)
    • 拓宽参考转换(§5.1.5)
    • 装箱转换(§5.1.7)后可选加宽参考转换
    • 取消装箱转换(§5.1.8)后可选地进行加宽原语转换
    请注意,我们需要的代码组合不在列表中。我们可以从该列表中得出以下结论:

    Number i = (byte) 10;
    
    这是从
    字节
    字节
    的装箱转换,然后是到
    数字
    的扩展引用转换

    这是从
    字节
    字节
    的拆箱转换,然后是从
    字节
    整数的扩展原语转换

    由于
    (byte)10
    是一个编译时常量,我们还必须考虑

    此外,如果表达式是
    byte
    short
    char
    int
    类型的常量表达式(§15.28):

    • 如果变量的类型是
      字节
      字符
      ,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换
    • 如果变量类型为:
      • Byte
        ,常量表达式的值可在类型
        Byte
        中表示
      • Short
        并且常量表达式的值可在类型
        Short
        中表示
      • Character
        并且常量表达式的值可在类型
        char
        中表示
    来自同一部分

    这允许一些有趣的组合,如

    Character c = (byte)10;
    

    但变量类型为
    Integer


    如上所述,从
    字节
    整数
    的转换不在列表中,因此旧的Eclipse版本允许它,这一事实可以被认为是一个在新版本中已修复的错误。

    接受该程序是在ecj中进行的,ecj于2011年修复


    PS:为什么要费心调查古代版本中的bug?您只在JDT/Core中缺少1419个错误修复。

    因此您的问题可以概括为“为什么这段代码在Java 7中工作而不是在Java 8中工作?”。是的,我不明白,为什么这段代码在Java 7中工作良好我在Java 7和Java 8中尝试了这段代码,但都给了我相同的错误。你确定这在java中有效吗7@janith1024您是否使用了
    javac
    ?我可以确认,这在EclipseIndigoSR2(ECJ)中有效。所以,这似乎是ECJ中的一个bug。我用不同的JDK(7和8)检查了Intellij idea中的这段代码,希望Eclipse版本中的问题显然,您是wright,旧版本的Eclipse允许这种转换“字节到整数”,但我没有找到任何关于此bug(或此增强)的参考这一事实很有趣。并非每个修复都有明确的错误报告,有时,它是重写特定算法的一部分,将修复多个问题。好的,我认为这个主题应该结束,因为将代码更改为
    整数i=Integer.valueOf((字节)10)
    ,例如,维塔利·弗拉索夫:你的问题是为什么,而不是如何更改代码。如果您想知道如何在代码中修复该问题,那么,只需删除过时的
    (byte)
    cast,
    整数i=10就完成了。如果您有一个
    byte
    类型的现有变量
    b
    ,您只需编写
    整数i=+b,考虑到一元
    +
    是不可操作的。但这不是你的问题。所以我不明白,为什么这个问题应该结束。你可以选择答案……首先,投票表决。我认为代码也不能在eclipse中编译。这是一个错误,而不是一个警告。所以我想问OP,如何通过
    javac
    在eclipse中编译代码?也许它根本就不会发生。或者OP在编写代码时禁用了eclipse验证机制。
    Byte b = 42;
    int i = b;
    
    Character c = (byte)10;
    
    Byte b = 'x';