Juv*_*uve 10 java double casting numbers long-integer
我Object obj知道其实是一个long.在某些数学代码中我需要它double.
直接将其加倍可以安全吗?
double x = (double)obj;
Run Code Online (Sandbox Code Playgroud)
或者我应该先把它转换成长,然后再加倍.
double x = (double)(long)obj;
Run Code Online (Sandbox Code Playgroud)
我还发现了另一个(不太可读)替代方案:
double x = new Long((long)obj).doubleValue();
Run Code Online (Sandbox Code Playgroud)
这样做有什么危险/含义?
解决方案摘要:
obj是一个Number而不是一个long.double x = ((Number)obj).doubleValue()double x = (long)obj有关Java6/7问题的更多详细信息,请阅读有关TJ答案的讨论.
编辑:我做了一些快速测试.两种投射方式(显式/魔术)具有相同的性能.
Nee*_*eet 10
当需要一个对象时(在我们的例子中Long),Java中的每个原始数字都被转换为其拳击类型,并且每个盒装数字是Number最安全的方式实例:
final Object object = 0xdeadbeefL;
final double d = ((Number)object).doubleValue();
Run Code Online (Sandbox Code Playgroud)
这里的危险是,一如既往,Object我们想要施放的不是类型,Number在这种情况下你会得到一个ClassCastException.您可以检查对象的类型
if(object instanceof Number) ...
Run Code Online (Sandbox Code Playgroud)
如果你想阻止类转换异常,而是提供一个默认值,如0.0.同样默默地失败的方法并不总是一个好主意.
我
Object obj知道其实是一个long.
不,你没有.long是原始数据类型,Java中的原始类型不是对象.请注意,基本类型long和java.lang.Long包装类之间存在差异.
您不能将Long(对象)long强制转换为(基元).要获得a的long价值Long,请致电longValue():
Long obj = ...;
long value = obj.longValue();
Run Code Online (Sandbox Code Playgroud)
直接投射它是否安全
double?
如果它实际上是一个原始的long,那么是的,你可以把它投射到一个double.如果它是一个Long对象,你不需要强制转换,你只需要调用doubleValue()它:
double x = obj.doubleValue();
Run Code Online (Sandbox Code Playgroud)