为什么分配短的字节只有当短是最后的工作?
有人可以解释为什么以下编译:
final short s1 = 1; final char c1 = 1; byte b1 = s1; byte b2 = c1;
但以下不(编译器错误信息是Type mismatch: cannot convert from short to byte
):
short s1 = 1; char c1 = 1; byte b1 = s1; byte b2 = c1;
答案是在JLS – 5.2中。 作业转换 :
..如果expression式是
byte
,short
,char
或int
types的常量expression式(第15.28节 ):
- 如果variables的types是
byte
,short
或char
,并且常量expression式的值可以用variables的types表示,则可以使用缩小的原始转换。
当你写:
final short s1 = 1;
expression式的值在编译时是已知的 ,因为它不能被改变,所以你不需要进行转换。
在你的第二个代码片段中,这个值在编译时是不知道的 – 它是在运行时计算的,所以你需要一个明确的转换。
如果您尝试编译以下代码:
final byte b1 = 200; final byte b2 = 200; byte sum = b1 + b1;
你会得到一个编译错误,因为右边的值对于编译器是已知的 ,而且它知道这个和不能适合一个byte
。
在第一个示例中,编译器知道s1
和c1
永远不会改变,并且它们的最终值( 1
)适合byte
。
在第二种情况下,编译器担心如果s1
和c1
被分配给一个byte
variables时它们不在0..255
-128..127
会发生什么,并警告你这是不安全的。
如果你明确地按照巴拉莱卡在评论中所提出的那样,让编译器感到宽慰,那么你似乎知道自己正在做什么(或者至less,如果事情是向南的话,有人会责怪),并且让你这样做。