我无法理解它之间的区别:
short d = 0;
//some code
node.accessible = d + 1;
和这个
short d = 0
//same code here
node.accessible = d;
node.accessible += 1;
第二件事是有效的,但第一件事是英特尔表演"不兼容的类型"错误。
P.S。节点类:
public class Node {
int n;
short accessible;
Node(int n){
this.n = n;
this.accessible = -1;
}
}
答案 0 :(得分:2)
在第一个版本中:
node.accessible = d + 1;
d + 1
生成int
,对int
进行求和,short
生成int
。
JLS确实说明了(看看最后一个案例,重点是我的):
<强> 5.6.2。二进制数字促销
当运算符将二进制数字提升应用于一对时 操作数,每个操作数必须表示可转换为a的值 数字类型,以下规则适用:
如果任何操作数属于引用类型,则将其取消装箱 转换(第5.1.8节)。
- 醇>
应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:
如果任一操作数的类型为double,则另一个操作数转换为double。
否则,如果任一操作数的类型为float,则转换另一个操作数 漂浮。
否则,如果任一操作数的类型为long,则转换另一个操作数 很久。
否则,两个操作数都将转换为int 。
但是,如果int
没有显式广播,则您无法将accessible
分配给short
字段int
的范围大于short
。
在第二个版本中,使用了复合赋值运算符(+=
):
node.accessible += 1;
因此,在您的情况下,操作的结果将转换为short
:左侧变量的类型为JLS个状态:
<强> 15.26.2。复合赋值运算符
形式E1 op = E2的复合赋值表达式是等价的 到E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1 仅评估一次。
更具体地说,在你的情况下:
否则,二进制操作的结果将转换为该类型 左侧变量的值,经过值集转换(§5.1.13) 到适当的标准值集(不是扩展指数值) set),转换结果存储在变量中。
答案 1 :(得分:2)
这是因为1
表达式中+ 1
的类型为int
。将short
添加到int
会导致int
无法在没有缩小回放到node.accessible
的情况下进行分配。
答案 2 :(得分:2)
在第二个样本中,
node.accessible += 1;
实际上是
node.accessible = (short)(node.accessible + 1);
所以它没有问题。
但在第一个
node.accessible = d + 1;
实际上是node.accessible = d + 1;
,并且它不会自动转换为短,因此会出现错误,因为(d + 1)
的类型为int