[英]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));
发生这种情况是因为如果我们在三元运算符中使用问题中的包装原始值( Integer
、 Float
、 Double
等),这两个值都将被拆箱并强制转换为通用类型。
这也可能导致意想不到的结果。
在第一个示例中, 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。 Pramotion 以下列方式发生 Byte -->Short-->Interger-->Long-->Float -->Double
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.