为什么分配短的字节只有当短是最后的工作?

有人可以解释为什么以下编译:

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式是byteshortcharinttypes的常量expression式(第15.28节 ):

  • 如果variables的types是byteshortchar ,并且常量expression式的值可以用variables的types表示,则可以使用缩小的原始转换。

当你写:

 final short s1 = 1; 

expression式的值在编译时是已知的 ,因为它不能被改变,所以你不需要进行转换。

在你的第二个代码片段中,这个值在编译时是不知道的 – 它是在运行时计算的,所以你需要一个明确的转换。


如果您尝试编译以下代码:

 final byte b1 = 200; final byte b2 = 200; byte sum = b1 + b1; 

你会得到一个编译错误,因为右边的值对于编译器是已知的 ,而且它知道这个和不能适合一个byte

在第一个示例中,编译器知道s1c1永远不会改变,并且它们的最终值( 1 )适合byte

在第二种情况下,编译器担心如果s1c1被分配给一个bytevariables时它们不在0..255 -128..127会发生什么,并警告你这是不安全的。

如果你明确地按照巴拉莱卡在评论中所提出的那样,让编译器感到宽慰,那么你似乎知道自己正在做什么(或者至less,如果事情是向南的话,有人会责怪),并且让你这样做。