有人可以解释java字节类型吗?
这不编译:
byte b1 = 9;
byte b2 = 1;
byte b3 = b1 + b2;
虽然这样做:
byte b4 = 9 + 1;
byte b5 = (char)(9+1);
此外,即使值适合一个字节,赋值给long也不起作用:
byte b7 = (long)127;
使用包装器甚至更奇怪
编译:
Byte b6 = (int)3;
但这不是:
Integer i = (byte)3;
答案 0 :(得分:8)
Java语言规范5.6.2二进制数字提升:“否则,两个操作数都被转换为int类型。”
因此,Java将两个操作数转换为int,因此添加的结果为int。
另外:b3和b4之间的区别在于,在b4中它是一个常量表达式(15.28),在b3中它是字面值。
答案 1 :(得分:3)
b6确实有效。 b7不起作用,因为编译时缩小仅限于所有原语但很长(有点奇怪,不明白为什么)
有趣的部分是§5.2 of the JLS:
In addition, if the expression is a constant expression (§15.28) of type byte, short, char or int :
A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
A narrowing primitive conversion followed by a boxing conversion may be used if the type of the variable is :
- Byte and the value of the constant expression is representable in the
type byte.
- Short and the value of the constant expression is representable in
the type short.
- Character and the value of the constant expression is representable in the type char.
If the type of the expression cannot be converted to the type of the variable by a conversion permitted in an assignment context, then a compile-time error occurs.
不知道为什么i
不起作用 - 扩展应该工作得很好,事实上,编译器应该生成类似Integer.valueOf((byte)3);
的东西。使用显式调用按预期工作,即发生扩展。
有趣的是,使用eclipse Java编译器Integer i = (byte) 3;
编译得很好,这让我相信你刚刚在javac中发现了一个错误 - 恭喜! (或者是eclipse编译器中的那个或者一个bug;但是eclipse的行为对我来说似乎是正确的)。 FWIW我已经报告了针对oracle的javac的错误..
在JLS中找到正确的部分比将其格式化更少,因为它有点可读 - 所以如果你改为使用链接,可能会更容易。
答案 2 :(得分:-1)
第一个代码片段产生编译错误,因为默认情况下所有数字常量都是java中的int
。