Java:将(long)Object转换为double的许多方法

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.
  • Java 6需要显式转换,例如: double x = ((Number)obj).doubleValue()
  • Java 7具有工作魔法: 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.同样默默地失败的方法并不总是一个好主意.


Jes*_*per 7

Object obj知道其实是一个long.

不,你没有.long是原始数据类型,Java中的原始类型不是对象.请注意,基本类型longjava.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)