根据这个答案,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")同样可怕!)
这是因为从转换的数int
到short
可能会失败(溢出),因为它是一个基本收缩转换.从理论上讲,编译器可以识别出该参数是一个常量表达式,它可以确定转换在编译时是否有效.但事实并非如此.
更简洁的方法是:
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类型中表示.
粗体情况适用于此处.
归档时间: |
|
查看次数: |
344 次 |
最近记录: |