2

根据我在 Java 中的知识,在缩小类型转换时,如果源中的任何常量都在字节范围内,则允许:

byte b=10; // allowed because 10 is in range of byte and 10 is a constant

但是当我输入这个时:

byte b=10l; // this is not allowed although 10 is in range of byte and is a constant 

为什么这样 ?您能否说出这些缩小转换在 Java 中发生的确切规则。

4

5 回答 5

3

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2

此外,如果表达式是byte、short、char 或 int类型的常量表达式(第 15.28 节) :

  • 如果变量的类型是byte、short 或 char,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换。

您有一个 long 类型的常量表达式,并且在这种情况下不能应用缩小原始转换。

所以你可以这样做:

  • byte b = 10
  • byte b = (int) 10
  • char b = (short) 10
  • byte b = (char) 10L
  • short b = (int) 10L

但你不能这样做:

  • byte b = 10L
  • byte b = (long) 10
于 2014-05-30T07:28:50.183 回答
2

技术上的答案是——因为规范是这样说的。The Java Language Specification , Java SE 8 Edition的第5.2 节“分配上下文”部分说明:

此外,如果表达式 [在赋值语句的右侧] 是类型为byteshortchar或的常量表达式(第 15.28 节) int

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

至于为什么它不允许常量表达式是 type long,我想是你永远不会“意外”以 type 结束long。在让编译器防止您错误地写为;byte b = 127的简写的同时,能够编写为 具体来说,能够写并不是那么有用,因为你为什么需要它?byte b = (byte) 127byte b = 128byte b = (byte) 128byte b = 127L

于 2014-05-30T07:33:12.463 回答
1

因为l你附加到 value 明确地告诉编译器 - “听着兄弟。我在这里有一个 'long' 字段。给它一个 'long' 字段所需的空间”。

显然,长值不能放入字节字段。所以,你得到错误 -Cannot Convert from Long to Byte

于 2014-05-30T07:23:00.620 回答
0

Java 是一种强类型语言。它隐式地处理从较小类型到较大类型的类型转换,但是在从较大类型到较小类型的类型转换的情况下,您需要通过类型转换显式地进行。

例如,long 可以容纳 int,但 int 没有足够的空间容纳 long,因此编译器会警告您。

所以在你的情况下,你可以这样做:

byte b= (byte) 10l;

希望这可以帮助

于 2014-05-30T07:25:47.643 回答
0

你是对的,10 在字节范围内。但是当你使用l带常量的后缀时,java 会理解这个常量是long. 因为long不能放入 abyte中,所以你会得到一个错误:可能会丢失精度,由 javac 说。

但是,byte b = (byte) 10l;有效,因为它是从longto的直接转换byte

于 2014-05-30T07:26:34.317 回答