我试图理解Java中日益缩小的原始转换概念。这是JLS 5.1.3所说的:
关于原始类型的22种特定转换称为“缩小原始转换”: 短字节或字符 字符到字节或短 从int到byte,short或char 长到字节,短,字符或整数 浮点到字节,short,char,int或long 双精度字节,短整数,字符,整数,长整数或浮点数
关于原始类型的22种特定转换称为“缩小原始转换”:
短字节或字符
字符到字节或短
从int到byte,short或char
长到字节,短,字符或整数
浮点到字节,short,char,int或long
双精度字节,短整数,字符,整数,长整数或浮点数
由于是隐式转换转换long到int,我们可以写出下面的代码:
long
int
public static void main (String[] args) throws java.lang.Exception { int c = 88L; //Compilation fail System.out.println(c); }
演示
但这是行不通的。为什么?从long到int的缩小转换应该已经应用。
由于存在隐式转换,因此将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) ,byte,short,char或int: 如果变量的类型是byte,short或char,并且常量表达式的值在变量的类型中可表示,则可以使用变窄的原始转换。 如果变量的类型为:变窄的原始转换,然后是装箱转换,可以使用: Byte常量表达式的值在类型中是可表示的byte。 …(与Short和类似Character)
此外,如果表达式类型的常量表达式(§15.28) ,byte,short,char或int:
byte
short
char
如果变量的类型是byte,short或char,并且常量表达式的值在变量的类型中可表示,则可以使用变窄的原始转换。
如果变量的类型为:变窄的原始转换,然后是装箱转换,可以使用:
Byte常量表达式的值在类型中是可表示的byte。
Byte
…(与Short和类似Character)
Short
Character
这就是为什么 这 是即使字面的类型有效的120是int:
120
byte x = 120;
将其与扩展转换(分配上下文 和 调用上下文中允许的转换)进行比较(JLS 5.3)。