2

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

 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

4 回答 4

4

规范

如果除移位运算符以外的整数运算符至少有一个 long 类型的操作数,则使用 64 位精度执行运算,并且数值运算符的结果为 long 类型。如果另一个操作数不长,则首先将其扩展(第 5.1.5 节)以通过数字提升(第 5.6 节)键入 long。

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

所以结果(short)2 - (short)1int.

只需使用

new Short((short) (2 - 1));
于 2013-06-06T16:35:03.697 回答
1

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

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

请注意,在:

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

(short) 1 - (short) 2实际上是一个int;但是 JVM 将其“向下转换”为一个short给定的,即这是您的声明所需的类型。

于 2013-06-06T16:35:34.347 回答
0

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

于 2013-06-06T16:40:09.077 回答
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 编程语言的设计者认为方法和构造函数参数的隐式缩小转换会给解决重载方法调用的过程增加不必要的复杂性。

于 2013-06-06T17:48:00.510 回答