理解缩小原始转换

时间:2015-03-09 07:13:17

标签: java

我正在尝试理解Java中缩小的原始转换概念。以下是JLS 5.1.3对此的说法:

  

原始类型的22个特定转换称为缩小   原始转换:

     

short to byte或char

     

char to byte或short

     

int to byte,short或char

     

long to byte,short,char或int

     

float to byte,short,char,int或long

     

double to byte,short,char,int,long或float

由于存在将long转换为int的隐式转换,因此我们可以编写以下代码:

public static void main (String[] args) throws java.lang.Exception
{
    int c = 88L; //Compilation fail
    System.out.println(c);
}

DEMO

但它不起作用。为什么?应该应用从long到int的缩小转换。

1 个答案:

答案 0 :(得分:6)

  

由于存在将long转换为int

的隐式转换

没有。有显式转换。缩小转换通常不会隐式应用,正是因为它们可能会丢失信息。所以你需要:

int c = (int) 88L;

确实,initial part of JLS section 5甚至给出了一个例子:

// Casting conversion (5.4) of a float literal to
// type int. Without the cast operator, this would
// be a compile-time error, because this is a
// narrowing conversion (5.1.3):
int i = (int)12.5f;

在某些情况下,缩小转化次数 明确应用于assignment contexts (JLS 5.2)

  

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

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

  •   
  • 如果变量的类型为:

    ,则可以使用缩小的基元转换,然后进行装箱转换。      
        
    • Byte,常量表达式的值可在byte类型中表示。

    •   
    • ...(类似于ShortCharacter

    •   
  •   

这就是有效的原因,即使文字120的类型为int

byte x = 120;

将其与扩展转换进行比较,这些转换在分配上下文调用上下文(JLS 5.3)中是允许的。