我有一个Object obj
我知道实际上是一个long
。
在一些数学代码中我需要它作为double
.
直接将其转换为双倍安全吗?
double x = (double)obj;
或者我应该先将其转换为 long,然后再转换为 double。
double x = (double)(long)obj;
我还找到了另一个(可读性较差的)替代方案:
double x = new Long((long)obj).doubleValue();
这样做有什么危险/影响?
解决方案总结:
-
obj
is a Number
而不是一个long
.
- Java 6 需要显式转换,例如:
double x = ((Number)obj).doubleValue()
- Java 7 具有有效的施放魔法:
double x = (long)obj
有关 Java6/7 问题的更多详细信息,请参阅以下讨论TJ的回答 https://stackoverflow.com/a/13855886/8986.
Edit:我做了一些快速测试。两种铸造方式(显式/魔法)具有相同的性能。
当需要对象时(在我们的例子中),Java 中的每个原始数字都会转换为其装箱类型Long
)并且每个盒装数字都是一个实例Number
最安全的方法是:
final Object object = 0xdeadbeefL;
final double d = ((Number)object).doubleValue();
一如既往,这里的危险在于Object
我们想要投射的类型不是Number
在这种情况下你会得到一个ClassCastException
。您可以检查对象的类型,例如
if(object instanceof Number) ...
如果您想防止类转换异常并提供默认值,例如0.0
。同样,默默失败的方法并不总是一个好主意。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)