小编典典

了解缩小原始转换

java

我试图理解Java中日益缩小的原始转换概念。这是JLS
5.1.3
所说的:

关于原始类型的22种特定转换称为“缩小原始转换”:

短字节或字符

字符到字节或短

从int到byte,short或char

长到字节,短,字符或整数

浮点到字节,short,char,int或long

双精度字节,短整数,字符,整数,长整数或浮点数

由于是隐式转换转换longint,我们可以写出下面的代码:

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

演示

但这是行不通的。为什么?从long到int的缩小转换应该已经应用。


阅读 225

收藏
2020-11-26

共1个答案

小编典典

由于存在隐式转换,因此将long转换为int

没有。有一个 明确的 转换。缩小转换通常不会隐式应用,正是因为它们会丢失信息。因此,您需要:

int c = (int) 88L;

实际上,JLS第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;

但是,在某些情况下,缩小转换 明确地应用于分配上下文(JLS
5.2)

此外,如果表达式类型的常量表达式(§15.28) ,byteshortcharint

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

  • 如果变量的类型为:变窄的原始转换,然后是装箱转换,可以使用:

    • Byte常量表达式的值在类型中是可表示的byte

    • …(与Short和类似Character

这就是为什么 是即使字面的类型有效的120int

byte x = 120;

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

2020-11-26