不兼容的类型。必需:short,Found:int

时间:2018-03-11 20:42:48

标签: java

我无法理解它之间的区别:

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;
}
}   

3 个答案:

答案 0 :(得分:2)

在第一个版本中:

node.accessible = d + 1;

d + 1生成int,对int进行求和,short生成intJLS确实说明了(看看最后一个案例,重点是我的):

  

<强> 5.6.2。二进制数字促销

     

当运算符将二进制数字提升应用于一对时   操作数,每个操作数必须表示可转换为a的值   数字类型,以下规则适用:

     
      
  1. 如果任何操作数属于引用类型,则将其取消装箱   转换(第5.1.8节)。

  2.   
  3. 应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

         
        
    • 如果任一操作数的类型为double,则另一个操作数转换为double。

    •   
    • 否则,如果任一操作数的类型为float,则转换另一个操作数   漂浮。

    •   
    • 否则,如果任一操作数的类型为long,则转换另一个操作数   很久。

    •   
    • 否则,两个操作数都将转换为int

    •   
  4.   

但是,如果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