带有“表达式”的Java类型促销

时间:2013-11-01 09:01:11

标签: java types promotions

下面的变量(称为b)是否可以被称为表达式,如果它是唯一位于等号右边的那个?

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

c = b;

我问这个问题的原因是因为表达式中的类型提升主题。我知道Java将所有字节提升为整数。这是该代码片段无法编译的唯一原因吗? (请注意,我知道演员阵容;这不是这个帖子的重点。非常感谢。)

修改 非常感谢Jon和Peter。使用第二个示例查看此主题:

byte b = 1;
short s = 2;

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

以下情况发生了吗?

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

如果这是正确的,那么它似乎是= b;和= b * 2;是Java处理不同的“表达式”。所以,= b; “表达式”不会转换为int,而是扩展为short。但是= b * 2;表达式转换为int,而不是简短,即使名为s的目标变量是短的。

编辑2: 还 - -

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

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

2 个答案:

答案 0 :(得分:5)

试试这个

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,因为2int值。如果b是最终的,你可以这样做,因为编译可以内联值。

答案 1 :(得分:1)

  

下面的变量(称为b)是否可以被称为表达式,如果它是唯一位于等号右边的那个?

是的,绝对。

  

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

嗯,在某些情况下。不在所有案例中。

从根本上说,代码无法编译,因为没有从bytechar的隐式转换。来自section 5.1.2 of the JLS(扩大原始转化次数):

  

对原始类型的19个特定转换称为扩展原语转换:

     
      
  • byteshortintlongfloatdouble
  •   
  • ...
  •   

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