短类实例创建表达式时编译错误

时间:2013-06-06 16:33:10

标签: java

我知道这可能是一个非常愚蠢的问题。我不明白为什么在短类实例创建表达式时编译错误。它适用于整数完美而不是短整数。

 public static void main(String[] args) {

            short i=(short)1 - (short)2;  //It works
            new Integer((int)1-(int)2); //It works
            new Short((short)2 - (short)1); //The constructor Short(int) is undefined
    }

提前致谢

4 个答案:

答案 0 :(得分:4)

来自the specification

  

如果移位运算符以外的整数运算符至少有一个   long类型的操作数,然后使用64位执行操作   精度,数值运算符的结果类型为long。   如果另一个操作数不长,则首先将其扩展(第5.1.5节)以进行输入   长期通过数字推广(§5.6)。

     

否则,操作使用32位精度执行,并且   数值运算符的结果是int类型。如果是任一操作数   不是int,它首先通过数字提升扩展为int类型。

因此(short)2 - (short)1的结果是int

只需使用

new Short((short) (2 - 1));

答案 1 :(得分:1)

除非您明确地转换它们,否则所有原始整数表达式都是int s(long除外)。您需要将整个表达式转换为short

new Short((short)(2 - 1));

请注意:

short i = (short) 1 - (short) 2;

(short) 1 - (short) 2实际上是一个int;但是JVM将它“转发”到short,因为这是你声明所要求的类型。

答案 2 :(得分:0)

Java语言规范确切地定义了整数的表示方式以及如何计算整数算术表达式。上面的表达式返回int,因为对于整数值,算术运算以整数形式执行(long除外)。如果您需要short作为构造函数参数,则应使用以下表达式:(short)(2-1)

答案 3 :(得分:0)

正如我从阅读中理解的那样,我得出了这个结论。

short i=(short)1 - (short)2; //It works

如果右手操作数是byte,short,char或int类型的编译时常量,并且该值落在左侧变量的范围内,则编译器将隐式地对赋值表达式进行缩小转换。变量的类型为byte,short或char。

new Short((short)2 - (short)1); //The constructor Short(int) is undefined

对于方法或构造函数的参数,情况并非如此。 Java编程语言的设计者认为隐式缩小方法和构造函数参数的转换会给解决重载方法调用的过程增加不必要的复杂性。