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

Java 创建短类实例表达式时发生编译错误,java,Java,我知道这可能是个很愚蠢的问题。我不明白为什么在创建短类实例表达式时出现编译错误。它适用于integer perfect,但不适用于Short 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 -

我知道这可能是个很愚蠢的问题。我不明白为什么在创建短类实例表达式时出现编译错误。它适用于integer perfect,但不适用于Short

 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
    }
提前感谢

来自:

如果除移位运算符以外的整数运算符至少有一个 long类型的操作数,然后使用64位执行该操作 精度,数值运算符的结果为long类型。 如果另一个操作数不长,则首先将其加宽(§5.1.5)以键入 长期数字促销(§5.6)

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

所以
(short)2-(short)1
的结果是
int

简单使用

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

除非显式强制转换,否则所有基本整数表达式都是
int
s(长
long
s除外)。您需要将整个表达式转换为
short

new Short((short)(2 - 1));
请注意:

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

(short)1-(short)2
实际上是一个int;但是JVM将其“降级”为
简短的
,因为这是您的声明所需的类型。

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

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

short i=(short)1-(short)2//它可以工作

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

newshort((Short)2-(Short)1)//构造函数Short(int)未定义


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

是的,但这些都是十进制数,而不是整数。对于十进制默认算术运算结果是double简单地说,任何算术运算的结果都可以是整数或更大的数据类型,如float或double,如果它包含该类型的任何操作数。所以你需要对结果进行分类。这不是正确的结论。读我的答案。基本上,
(short)1-(short)2
是一个int,这些强制转换是完全无用的。重要的是将结果强制转换为short,以便
short
构造函数可以接受它。