为什么这段代码在Java7中工作而不是在Java8中工作?
我目前正在使用IDEEclipse版本:Neon.2发行版(4.6.2)和JavaVersion8Update131。 在这段代码中,IDE给出了一个错误-“类型不匹配:无法从字节转换为整数”:为什么这段代码在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版本: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
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';