如果我写这样的东西
System.out.println(18);
哪种类型带有'18'?是int还是byte?还是还没有类型?
它不能是int,因为这样是正确的:
byte b = 3;
这是不正确的:
int i = 3;
byte bb = i; //error!
编辑:我想我在Assignment Conversion中找到了规范中的正确部分:
常量的编译时缩小意味着代码如:
byte theAnswer = 42;
被允许。如果不进行缩小,则整数文字42具有int类型的事实意味着将需要强制转换为字节:
byte theAnswer =(byte)42; //允许但不是强制转换
此
18
被称为integer literal。有各种各样的literals,浮点数,String
,字符等。>
在下面,
byte b = 3;
文字
3
是整数文字。这也是一个常量表达式。并且由于Java可以告诉3
适合byte
,因此它可以安全地应用narrowing primitive conversion并将结果存储在byte
变量中。
在此
int i = 3; byte bb = i; //error!
文字
3
是一个常量表达式,但变量i
不是。编译器只是简单地确定i
不是常数表达式,因此不会竭尽全力找出其值,到byte
的转换可能会丢失信息(如何将12345
转换为byte
?),因此不应允许。您可以通过使i
为常量变量来覆盖此行为
final int i = 3; byte bb = i; // no error!
或通过指定显式强制转换
int i = 3;
byte bb = (byte) i; // no error!