我正在尝试理解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);
}
但它不起作用。为什么?应该应用从long到int的缩小转换。
答案 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):
此外,如果表达式是类型为
byte
,short
,char
或int
的常量表达式(第15.28节):
如果变量的类型为
byte
,short
或char
,则可以使用缩小的基元转换,并且常量表达式的值可在变量的类型。如果变量的类型为:
,则可以使用缩小的基元转换,然后进行装箱转换。
Byte
,常量表达式的值可在byte
类型中表示。...(类似于
Short
和Character
)
这就是此有效的原因,即使文字120
的类型为int
:
byte x = 120;
将其与扩展转换进行比较,这些转换在分配上下文和调用上下文(JLS 5.3)中是允许的。