我真的发现转换的概念令人困惑。
short a = 34;
short b = (short)34;
这两个陈述在语言上有什么区别?我认为,在第一个语句中,int文字34直接存储在short变量a中,导致int文字34转换为short文字34。在第二个语句中,似乎int文字34首先被转换为短字面量34由于转换指令而存储在短变量b中。我是对的还是两种情况之一?
这两个语句之间的功能区别是什么?
在此示例中没有功能差异。在此示例中,最终结果是相同的。
从(Java)语言的角度来看,这是两种不同的情况:
short b = (short) 34;
数字34
是int
文字。 (short)
是一种类型转换,它执行显式的缩小原始转换。如有必要,这将截断该值,尽管此处没有必要。然后,您将获得一个short
值,该值已分配给该变量,而无需进一步转换。
short b = 34;
数字34
是int
文字。在这种情况下,存在一个隐式的缩小原始转换。这种“特殊情况”发生在以下情况的分配上下文中:
byte
,char
或short
,并且AND这不会截断该值。
如果将代码更改为以下代码,则两个上下文之间的区别将变得显而易见:
short a = 100000; // Compilation error because 100,000 is too large
short b = (short) 100000; // OK - 100,000 is truncated to give -31,072
或者:
int x = 34;
short y = x; // Compilation error because 'x' is NOT
// a constant expression
JLS中最相关的部分是5.2 Assignment Contexts和5.4 Casting Contexts。