从int到short的可能有损转换

时间:2014-06-11 23:00:13

标签: java arrays int short

我已将数组gx,数组arr定义为短类型。但是为什么左边的操作可能会以int类型结束,我必须把它简化为什么?编译器错误可能是从int到short的有损转换。

这是我的代码。

public PixImage sobelEdges() {

short gy=0;
for(int x=1;x<width-1;x++){
    for(int y=1;y<height-1;y++){
       // if(x=){
            for(int z=0;z<3;z++){
            gx[x][y][z]=arr[x-1][y-1][z]-arr[x+1][y-1][z]+2*arr[x-1][y][z]-2*arr[x+1][y][z]+arr[x-1][y+1][z]-arr[x+1][y+1][z];

            }
       // }    
    }     
}   
return this;
// Don't forget to use the method mag2gray() above to convert energies to
// pixel intensities.

}

那是因为所谓的unbox吗?所以这意味着我每次进行操作都需要施放?

1 个答案:

答案 0 :(得分:10)

这不是拆箱;这是“二进制数字促销”。 Section 5.6.2 of the JLS州:

  

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

     
      
  1. 如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。

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

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

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

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

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

    •   
  4.   

  

对某些运算符的操作数执行二进制数字提升:

     
      
  • 乘法运算符*,/和%(§15.17)

  •   
  • 数字类型的加法和减法运算符+和 - (§15.18.2)

  •   
  • 数字比较运算符&lt;,&lt; =,&gt;和&gt; =(§15.20.1)

  •   
  • 数字相等运算符==和!=(§15.21.1)

  •   
  • 整数位运算符&amp;,^和| (§15.22.1)

  •   
  • 在某些情况下,条件运算符? :(§15.25)

  •   

(强调我的)

当这些值被添加/相乘时,它们会在数学运算完成之前提升为int。最后,您可以在分配回数组之前回退到short

gx[x][y][z] = (short) (arr[x-1][y-1][z]-arr[x+1][y-1][z]+2*arr[x-1][y][z]
    -2*arr[x+1][y][z]+arr[x-1][y+1][z]-arr[x+1][y+1][z]);

每次使用小于int的原始数据类型时,都需要将其强制转换,例如在short示例中。