java中的隐式缩小规则

时间:2015-06-11 07:14:03

标签: java narrowing

byte b = 0xFFFFFFFF; //OK, because integer -1 sits between -128 and 127, FINE!!
char ch = 0xFFFFFFFF; //Not OK, because integer -1 does not sit between 0 and 65535, FINE!!
byte b = 0L; //Compiler says Not OK? But long integer 0 sits between -128 and 127?

我不相信java编译器在上面第三行代码中应用的缩小规则。

请帮助我理解这条缩小规则背后的逻辑。

2 个答案:

答案 0 :(得分:3)

文字L上的0L后缀使这个字面为long(64位有符号整数)。

根据Java语言的规则,longbyte没有隐含的缩小。

请参阅Java语言规范section 5.2 Assignment Contexts

  

此外,如果表达式是类型为byteshortcharint的常量表达式(第15.28节):

     
      
  • 如果变量的类型是byteshortchar,则可以使用缩小的基元转换,并且常量表达式的值可以在类型中表示。变量
  •   

请注意,常量表达式的类型不包括long

答案 1 :(得分:0)

将原始数据类型转换为另一种数据类型有两种方法。明确和隐含。

您的情况byte b = 0L;中的隐式转换会出现编译错误,因为可能会丢失信息。

如果你改变它:

byte b=(byte)0L;

然后就没有编译器错误了,因为你明确告诉编译器转换。