缩小类型转换:为什么允许将int赋值给声明中的字节?

Kev*_*vin 5 java type-conversion

对于中级Java程序员来说,这听起来太微不足道了.但在我审查Java基础知识的过程中,发现了一个问题:

为什么缩小转换范围如下:

byte b = 13;
Run Code Online (Sandbox Code Playgroud)

将被允许

int i = 13;
byte b = i;
Run Code Online (Sandbox Code Playgroud)

会被编译器抱怨吗?

Nic*_*rey 10

因为byte b = 13 ;是常数的赋值.它的值在编译时是已知的,因此编译器可以/应该/将会抱怨如果赋值的值会导致溢出(尝试byte b = 123456789 ;看看会发生什么).

一旦将它分配给变量,就会分配一个表达式的值,虽然它可能是不变的,但编译器并不知道.该表达式可能导致溢出,因此编译器发出呜呜声.