1
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 编译器在上述代码的第三行中应用的缩小规则。

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

4

2 回答 2

3

文字上的L后缀0L使该文字成为类型long(64 位有符号整数)。

根据 Java 语言的规则,从long到没有隐式缩小。byte

请参阅 Java 语言规范第 5.2 节分配上下文

此外,如果表达式是 、 、 或 类型的常量表达式(第byte15.28shortcharint

  • 如果变量的类型是 、 或 ,并且常量表达式的值可以用变量的类型表示,则可以使用窄化原byteshort转换char

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

于 2015-06-11T07:16:36.993 回答
0

有两种方法可以将原始数据类型转换为另一种。显式和隐式。

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

如果你像这样改变它:

byte b=(byte)0L;

然后不会有编译器错误,因为您明确地告诉编译器进行转换。

于 2015-06-11T07:26:38.887 回答