【发布时间】:2020-02-28 04:44:23
【问题描述】:
我的问题是编译时间常数在内部是如何工作的,所以我们在下面的语句中没有收到错误。
final int a = 10;
byte b = a;
以及为什么我在此语句中遇到错误。
int a = 10;
byte b = a;
【问题讨论】:
-
同样的原因
byte b = 10;是合法的。在某些上下文中,编译器可以确定该值在byte的有效范围内。常量就是这样。
我的问题是编译时间常数在内部是如何工作的,所以我们在下面的语句中没有收到错误。
final int a = 10;
byte b = a;
以及为什么我在此语句中遇到错误。
int a = 10;
byte b = a;
【问题讨论】:
byte b = 10; 是合法的。在某些上下文中,编译器可以确定该值在byte 的有效范围内。常量就是这样。
这是因为并非所有整数都适合一个字节。
在您的第一个示例中,a 的值是已知的并且无法更改。编译器知道它将适合一个字节。
在你的第二个例子中,因为a 不是最终的,它可能已经被改变了(虽然不是在你的例子中)。 Java 编译器不够聪明,无法注意到没有任何改变,因此不再确定它是否适合一个字节。
举个例子,看看这个:
final int a = 10000;
byte b = a;
因为 a 的值现在太大而无法放入 int,它不再编译。
【讨论】:
1. 对于二元运算符('=' 或 '+'...),编译器使用数值提升系统。这会在执行操作之前将“原始类型”提升为低于“int”的“原始类型”,如 byte char 并缩短为“int”。
2.然后是 byte、char、short,接受一个常量且适合其类型大小的 int 值。
所以下面会编译:
final int int1 = 10;
byte byt1 = int1; /* int to byte and when compiling to bytecode byt1 is assigned 10 and not a variable int1 as it's a final constant.*/
这不会编译:
byte byt1 = 2;
byte byt2 = +byt1; /* int to byte but when compiling to bytecode byt1 is not assigned 2 as byt1 value might change at run time to a value larger than what byte can support so you get compiler error.*/
这不会编译:
final long lng1 = 10;
byte byt2 = lng1; /* long type to byte. remember byte, char and short only accept int.*/
【讨论】:
在以下情况下,当您的 int 值不是 final 时,您必须将 int 转换为 byte,同时在 java 中为 byte 分配一个整数值。
int a=11;
byte b= (byte) a;
【讨论】: