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)