我有一个Object obj
,我知道其实是一个long
。 在一些数学代码,我需要它作为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的答案 。
编辑:我做了一些快速测试。 铸造(显式/魔法)这两种方法有同样的表现。
由于Java中的每个原始数字被转换为需要(在本例中的对象时,它的拳击式Long
),每盒装数量是实例Number
这样做是最安全的方法:
final Object object = 0xdeadbeefL;
final double d = ((Number)object).doubleValue();
这里存在的危险是,一如既往的Object
,我们要投的类型是不Number
在这种情况下,你会得到一个ClassCastException
。 您可以检查对象的类型一样
if(object instanceof Number) ...
如果你想防止造型异常,而是提供一个默认值,像0.0
。 也默默地失败的方法并不总是一个好主意。
我有一个Object obj
,我知道其实是一个long
。
不,你不知道。 long
为原始数据类型,和原始类型在Java中不是对象。 需要注意的是有基本类型之间的区别long
和java.lang.Long
,这是一个包装类。
你不能施放Long
(对象)到long
(原语)。 要获得long
价值出来的Long
,调用longValue()
就可以了:
Long obj = ...;
long value = obj.longValue();
它是安全的直接铸造它double
?
如果它实际上是一种原始的long
,那么,你可以强制转换成一个double
。 如果它是一个Long
目标,你不需要投,你可以调用doubleValue()
就可以了:
double x = obj.doubleValue();
简单的铸件应完全正常工作。 这将是比通过包装类去,得到的字符串表示,然后解析翻番,再次使用长期价值创造新的实例更快 - 更重要的是,它更具有可读性。
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 o = 5L;
double d = (long) o; //Apparently only works on Java 7+
//or
double d = (Long) o;