如果我写这样的话
System.out.println(18);
哪种类型有' 18'? 是 int 还是 byte ? 或者它还没有类型?
它不能是int,因为这样的事情是正确的:
byte b = 3;
这是不正确的:
int i = 3;
byte bb = i; //error!
编辑: 我想我在Assignment Conversion的规范中找到了正确的部分:
常量的编译时缩小意味着代码如:
字节theAnswer = 42;
是允许的。如果没有缩小,整数文字42的类型为int的事实意味着需要转换为字节:
byte theAwerwer =(byte)42; //允许施放但不是必需的
答案 0 :(得分:6)
此
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
可能会丢失信息(如何转换{{ 1}}到12345
?)因此不应该被允许。您可以通过使byte
成为常量变量
i
或指定明确的演员
final int i = 3;
byte bb = i; // no error!
答案 1 :(得分:1)
JLS-4.2.1 - Integral Types and Values
整数类型的值是以下范围内的整数:
- 适用于
byte
,从-128到127(含)- 对于
short
,从-32768到32767,包括- 对于
int
,从-2147483648到2147483647,包括long
,从-9223372036854775808到9223372036854775807(含)- 对于
char
,从'\ u0000'到'\ uffff'(含),即从0到65535
如果整数文字后缀为ASCII字母L或l(ell),则其长度为long;否则它的类型为int(§4.2.1)。
最后,JLS-3.10.2 - Floating-Point Literals包括
浮点文字的类型为float,如果后缀为ASCII字母F或f;否则其类型为double,并且可以选择以ASCII字母D或d(§4.2.3)为后缀。
至于byte b = 3;
,它是从int
到byte
的{{3}}。