Java:将(long)Object转换为double的许多方法
我有一个Object obj
,我知道它实际上很long
。 在某些Math代码中,我需要它为double
。
直接将其加倍可以安全吗?
double x = (double)obj;
或者我应该先把它再做一次然后再加倍。
double x = (double)(long)obj;
我还发现了另一个(不太可读)替代方案:
double x = new Long((long)obj).doubleValue();
这样做有什么危险/含义?
解决方案总结
-
obj
是一个Number
而不是long
。 - Java 6需要显式转换,例如:
double x = ((Number)obj).doubleValue()
- Java 7具有工作魔法:
double x = (long)obj
有关Java6 / 7问题的更多详细信息,请阅读有关TJ答案的讨论。
编辑:我做了一些快速测试。 两种投射方式(显式/魔术)具有相同的性能。
当需要一个对象时(在我们的例子中为Long
),Java中的每个原始数字都被转换为其拳击类型,并且每个盒装数字都是Number
的实例,最安全的方法是:
final Object object = 0xdeadbeefL; final double d = ((Number)object).doubleValue();
这里的危险一如既往,我们想要转换的Object
不是Number
类型,在这种情况下你将得到ClassCastException
。 您可以检查对象的类型
if(object instanceof Number) ...
如果你想阻止类转换exception,而是提供一个像0.0
这样的默认值。 同样默默地失败的方法并不总是一个好主意。
我有一个
Object obj
,我知道它实际上很long
。
不,你没有。 long
是原始数据类型,Java中的原始类型不是对象。 请注意,基本类型long
和java.lang.Long
之间存在差异,它是一个包装类。
你不能将Long
(对象)强制转换为long
(primitive)。 要从Long
获取long
值,请在其上调用longValue()
:
Long obj = ...; long value = obj.longValue();
直接将其
double
可以安全吗?
如果它实际上是一个原始的long
,那么是的,你可以把它强制转换为double
。 如果它是一个Long
对象,你不需要doubleValue()
,你可以在它上面调用doubleValue()
:
double x = obj.doubleValue();
简单的铸造应该完美无缺。 这将比通过包装类更快,获取字符串表示然后解析为double,使用long值再次创建新实例 – 更重要的是,它更具可读性。
double d = (double)15234451L;
你可以将它强制转换为Long
(因为Object
不是 long
而是Long
),然后将Long
转换为double
:
double d = (double)(Long)obj;
例如,它的预期输出为2.6666666666666665:
public class CastDouble { public static final void main(String[] args) { Object o = 15L; System.out.println(40 / (double)(Long)o); } }
您只需要一个强制转换,从Object到Long或long(隐式转换为Long然后应用拆箱):
Object o = 5L; double d = (long) o; //Apparently only works on Java 7+ //or double d = (Long) o;