究竟什么是缩小java中的类型转换?

时间:2014-05-30 07:19:28

标签: java narrowing

根据我在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中进行这些缩小转换的确切规则。

5 个答案:

答案 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,部分说明:

  

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

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

至于为什么它不允许常量表达式为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;有效,因为它是从longbyte的直接投射。