根据我在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中进行这些缩小转换的确切规则。
答案 0 :(得分:2)
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2:
另外,如果表达式是常量表达式(§15.28) 输入 byte,short,char或int :
- 如果变量的类型为 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
答案 1 :(得分:1)
技术答案是 - 因为规范是这样说的。 §5.2 "Assignment Contexts" of The Java Language Specification, Java SE 8 Edition,部分说明:
此外,如果表达式[在赋值语句的右侧]是类型
byte
,short
,char
的常量表达式(第15.28节),或int
:
- 如果变量的类型是
byte
,short
或char
,则可以使用缩小的基元转换,并且常量表达式的值可以在类型中表示。变量
至于为什么它不允许常量表达式为long
类型,我想这是因为你永远不会“意外地”以类型long
结束。能够将byte b = 127
写为byte b = (byte) 127
的简写是非常方便的,同时让编译器阻止您错误地将byte b = 128
写为byte b = (byte) 128
的简写;能够写byte b = 127L
是没有用的,具体来说,因为你为什么需要呢?
答案 2 :(得分:0)
因为你附加到值的l
明确地告诉编译器 - “听兄弟。我在这里有一个'long'字段。给'long'字段需要空间”。
显然长值不适合字节字段。
因此,您会收到错误 - Cannot Convert from Long to Byte
答案 3 :(得分:0)
Java是一种强类型语言。它隐含地处理从较小类型到较大类型的类型转换,但是如果类型转换从较大类型转换为较小类型,则需要通过类型转换显式执行。
例如,long可以容纳int但是int没有足够的空间来容纳long,所以编译器会警告你。
所以在你的情况下,你可以这样做:
byte b= (byte) 10l;
希望这有帮助
答案 4 :(得分:0)
你是对的,10是在字节范围内。但是当你使用l
后缀和常量时,java会理解这个常量是long
。由于long
无法适应byte
,因此您会收到错误:javac可能会导致精度下降。
但是,byte b = (byte) 10l;
有效,因为它是从long
到byte
的直接投射。