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中的原始类型不是对象。 请注意,基本类型longjava.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;