使用"表达式"进行 Java 类型升级



下面的变量(称为b)可以称为表达式吗?如果它是位于等号右侧的唯一东西?

// This code fragment will not compile.
// c is a char, and b is a byte.
c = b;

我之所以问这个问题,是因为表达式中的类型提升主题。 我知道Java将所有字节提升为整数。 这是此代码片段无法编译的唯一原因吗? (请注意,我知道演员表;这不是这个线程的重点。 多谢。

编辑:非常感谢乔恩和彼得。 使用第二个示例查看本主题:

byte b = 1;
short s = 2;
s = b;  // OK
s = b*2;  // Not OK (compilation error)

以下情况是否属实?

(第 3 行)Java 将字节转换为短字节。(第 4 行)Java 将表达式 b*2 转换为 int。

如果这是正确的,那么 =b; 和 =b*2; 似乎是 Java 以不同方式处理的"表达式"。 所以,=b;"表达式"不是转换为整数,而是加宽为短。 但是 =b*2;表达式被转换为 int,而不是短整型,即使名为 s 的目标变量是短变量。

编辑 2:也-

short s1, s2 = 2, s3 = 2;
s1 = s2*s3;  // Not OK (compilation error)

即使所有三个变量都是短变量,s2*s3; 表达式也会提升为 int,从而导致编译错误。

试试这个

byte b = -1;
short s = b; // is ok as a byte can be promoted to an short.
int i = b; // is ok as a byte can be promoted to an int.
float f = b; // is ok as a byte can be promoted to an float, long or double.
char c = b; // won't compile

final byte b = 1;
char c = b; // compiles fine as the compiler can inline the value.

在这种情况下

short s = b*2;  // Not OK (compilation error)

b * 2 是一个int,因为2是一个int值。 如果b是最终的,您将能够这样做,因为编译可以内联值。

下面的变量(称为 b)可以称为表达式吗,如果它是位于等号右侧的唯一东西?

是的,绝对。

我知道Java将所有字节提升为整数。

好吧,在某些情况下。并非在所有情况下。

从根本上说,代码无法编译,因为没有从bytechar的隐式转换。从 JLS 的第 5.1.2 节(扩大基元转换):

元类型的 19 种特定转换称为扩大基元转换:

  • byte shortintlongfloatdouble

请注意,目标类型列表中缺少char byte转化的目标类型列表中缺少。

最新更新