繁体   English   中英

Java 三元运算 - 接受 Integer

[英]Java Ternary Operations - Accepting Integer

如果我有这样的三元语法,编译器不会抛出任何编译错误:

int s = 2;
Double sdf = (s > 3 ?  new Double(12) : new Integer(12));

但是,如果我有这个,它会引发编译错误:

所需类型:双提供:Integer

Double sdf = (s > 3 ?  new Integer(12) : new Integer(12));

发生这种情况是因为如果我们在三元运算符中使用问题中的包装原始值( IntegerFloatDouble等),这两个值都将被拆箱并强制转换为通用类型。

这也可能导致意想不到的结果。

在第一个示例中, new Integer(12)将被转换为double精度类型,因为它是通用类型。 因此不存在编译问题。

但在第二个示例中,两者都是Integer与左侧类型Double不兼容。

取自 Sonar 规则描述S2154的示例:

Integer i = 123456789;
Float f = 1.0f;
// Assume condition = true
Number n = (condition) ? i : f; // i is coerced to float. n = 1.23456792E8

为了解决这个问题,我们需要进行显式转换:

Integer i = 123456789;
Float f = 1.0f;
// Assume condition = true
Number n = condition ? (Number) i : f;  // n = 123456789

附加建议:不要使用new Double()new Integer()等。这些构造函数已弃用。 而是使用valueOf方法

根据条件运算符? : 规范,如果一个操作数是Integer而另一个是Double 二进制数字提升用于解析结果类型。

根据规则,在第一个示例中,结果类型为Integer但在第二个示例中为Double (拆箱 + 扩大)。

这是因为内部类型被提升了。 Integer 可以加倍。 但是double不能降级为Integer。 Pramotion 以下列方式发生 Byte -->Short-->Interger-->Long-->Float -->Double

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM