【发布时间】:2021-09-09 06:04:08
【问题描述】:
JLS §5.6.1 说:
某些运算符将一元数字提升应用于单个操作数,该操作数必须生成数字类型的值:
的每个操作数
...
如果操作数是编译时类型 byte、short 或 char,则通过扩展原语转换将其提升为 int 类型的值
...
在以下情况下,会对表达式执行一元数值提升:
...
移位运算符 > 或 >>>
这就解释了为什么这个程序无法编译:
public class xx {
public short twice(short x) {
return x << 1;
}
}
出现此错误:
$ javac xx.java
xx.java:3: error: incompatible types: possible lossy conversion from int to short
return x << 1;
^
1 error
好的。那么为什么这个程序会编译成功呢?
public class xx {
public short two() {
return (short)1 << 1;
}
}
表达式 (short)1 不符合“编译时类型字节、短或字符”的条件吗?
这是我正在使用的:
$ java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-bre_2021_01_20_16_37-b00)
OpenJDK 64-Bit Server VM (build 25.282-b00, mixed mode)
【问题讨论】:
-
实际上,在函数 two() 中进行强制转换不会改变任何东西。我猜编译器将 1