为什么Short.valueOf(n)需要强制转换

Ric*_*ard 3 java casting

根据这个答案,int常量被隐式转换为short类型.

但在我的单元测试中,我想测试一个返回Short的getValue()函数.

assertEquals(obj.getValue(), 42); 
Run Code Online (Sandbox Code Playgroud)

显然上面的方法不起作用,所以我尝试使用Short.valueOf

assertEquals(obj.getValue(), Short.valueOf(42)); 
Run Code Online (Sandbox Code Playgroud)

然而,这仍然抱怨 - 尽管上面提到了隐含的转换 - 所以我必须施展文字.

assertEquals(obj.getValue(), Short.valueOf((short)42)); 
Run Code Online (Sandbox Code Playgroud)

Short.valueOf((短)5)似乎有点乱!有更干净的方式吗?(新短片("42")同样可怕!)

biz*_*lop 8

这是因为从转换的数intshort可能会失败(溢出),因为它是一个基本收缩转换.从理论上讲,编译器可以识别出该参数是一个常量表达式,它可以确定转换在编译时是否有效.但事实并非如此.

更简洁的方法是:

Short s = 42; //autoboxing is done here
assertEquals(obj.getValue(), s );
Run Code Online (Sandbox Code Playgroud)

上述工作的原因是变量赋值规则是不同的.这里编译器确实检查是否可以将常量表达式转换为short没有溢出.

此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.

如果变量的类型是:则可以使用缩小的基元转换,然后进行装箱转换:

字节和常量表达式的值可在类型字节中表示.

Short和常量表达式的值可以在short类型中表示.

字符和常量表达式的值可在char类型中表示.

粗体情况适用于此处.