让我们考虑Java中的一些简单表达式。
byte var=0;
var=(byte)(var+1);
这里,在上面的陈述中,由于自动类型提升,显然需要类型转换。
表达式(var + 1)的评估会自动提升为int,因此必须明确地转换为byte,以将其结果赋值给赋值右侧的字节变量。是 var
现在,我们在Java中考虑以下语句。
var++;
这有点等同于之前的声明,虽然它可以在没有强制转换的情况下工作但是应该需要一个强制转换。为什么呢?
即使以下声明也不需要演员表。为什么呢?
byte x=var++;
答案 0 :(得分:9)
来自Java Language Specification, §15.14.2:
后缀增量表达式的类型是变量的类型。
另一方面,对于表达式var + 1
,以下规则适用(JLS, §5.6.2):
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则依次使用widening conversion (§5.1.2)转换操作数:
•如果任何操作数属于引用类型,则执行unboxing conversion (§5.1.8)。然后:
•如果任一操作数的类型为double,则另一个操作数转换为double •否则,如果任一操作数的类型为float,则另一个操作数转换为float •否则,如果任一操作数的类型为long,则另一个操作数转换为long •否则,两个操作数都将转换为int类型。
因此,添加两种数字类型永远不会使结果比int
更窄。