【问题标题】:Ambiguous concept of conversion in JavaJava中转换的模糊概念
【发布时间】:2020-02-25 15:22:41
【问题描述】:

我真的觉得转换的概念很混乱。

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

这两种说法的语言区别是什么? 我认为,在第一个语句中,int 文字 34 直接存储在短变量 a 中,导致 int 文字 34 转换为短文字 34。在第二个语句中,似乎 int 文字 34 首先转换为由于转换指令,短文字 34 然后存储在短变量 b 中。我是正确的还是这两种情况之一?

【问题讨论】:

  • 这两个是等价的。类型转换是在第一行自动为您完成的,因此编写第二行没有用。该语法(称为强制转换)在其他情况下很有用,尝试将 int 存储在 short 中可能无法保持与 int 相同的值,因为它超出了 short 值的范围。就像int a = 34; short b = (short)a; 编译器不应该知道 a 的值为 34,它所知道的只是你将一个未知的 int 值放在一个 short 中,这可能是一个错误,所以你需要一个强制转换来执行你的选择。
  • @kumesana 谢谢,但仍然不清楚我的查询...
  • 好吧,详细说明一下会很聪明,因为您的查询是这两个语句之间的功能差异是什么,我隐含地解释了第一个与第二个相同,因此没有区别。
  • @kumesana 好的,我会尽量简单。仅考虑第一条语句,Java是直接将int字面量存储到short变量中还是Java先将其转换为short字面量然后存储在short变量中?
  • 我想你不明白什么是文字。文字只能是您在源代码中编写的内容。编译器不编写源代码,因此他们所做的任何事情都不会产生文字。文字是一个值,您按字面意思书写。就像 32 是字面上的值 32。虽然 a + b 可能是值 32,如果碰巧将变量 a 和 b 的值相加得出 32。32 是文字,而 a + b 不是,尽管两者是相同的值在 a + b 给出值 32 的情况下。无论如何,在第一种情况下,Java 首先将 int 值转换为 short 值,然后将其存储。

标签: java type-conversion implicit-conversion


【解决方案1】:

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

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

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

short b = (short) 34;

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

short b = 34;

数字 34int 文字。在这种情况下,有一个隐式的缩小原语转换。这种“特殊情况”发生在赋值上下文中:

  1. 被评估的表达式是一个编译时常量表达式,AND
  2. 变量的类型是byte, char or short, 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2017-01-13
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2012-09-05
    • 2016-08-30
    相关资源
    最近更新 更多