Java中转换的模棱两可的概念

问题描述 投票:1回答:1

我真的发现转换的概念令人困惑。

short a = 34;
short b = (short)34;

这两个陈述在语言上有什么区别?我认为,在第一个语句中,int文字34直接存储在short变量a中,导致int文字34转换为short文字34。在第二个语句中,似乎int文字34首先被转换为短字面量34由于转换指令而存储在短变量b中。我是对的还是两种情况之一?

java type-conversion implicit-conversion
1个回答
1
投票

这两个语句之间的功能区别是什么?

在此示例中没有功能差异。在此示例中,最终结果是相同的。

从(Java)语言的角度来看,这是两种不同的情况:

short b = (short) 34;

数字34int文字。 (short)是一种类型转换,它执行显式的缩小原始转换。如有必要,这将截断该值,尽管此处没有必要。然后,您将获得一个short值,该值已分配给该变量,而无需进一步转换。

short b = 34;

数字34int文字。在这种情况下,存在一个隐式的缩小原始转换。这种“特殊情况”发生在以下情况的分配上下文中:

  1. 正在评估的表达式是编译时间常量表达式,和
  2. 变量的类型为bytecharshort,并且AND
  3. 表达式的值可以用变量的类型表示。

这不会截断该值。


如果将代码更改为以下代码,则两个上下文之间的区别将变得显而易见:

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 Contexts5.4 Casting Contexts

© www.soinside.com 2019 - 2024. All rights reserved.