Java的:铸造(长)对象翻番的多种方式(Java: many ways of casting a

2019-08-04 00:37发布

我有一个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的答案 。

编辑:我做了一些快速测试。 铸造(显式/魔法)这两种方法有同样的表现。

Answer 1:

由于Java中的每个原始数字被转换为需要(在本例中的对象时,它的拳击式Long ),每盒装数量是实例Number这样做是最安全的方法:

final Object object = 0xdeadbeefL;
final double d = ((Number)object).doubleValue();

这里存在的危险是,一如既往的Object ,我们要投的类型是不Number在这种情况下,你会得到一个ClassCastException 。 您可以检查对象的类型一样

if(object instanceof Number) ...

如果你想防止造型异常,而是提供一个默认值,像0.0 。 也默默地失败的方法并不总是一个好主意。



Answer 2:

我有一个Object obj ,我知道其实是一个long

不,你不知道。 long为原始数据类型,和原始类型在Java中不是对象。 需要注意的是有基本类型之间的区别longjava.lang.Long ,这是一个包装类。

你不能施放Long (对象)到long (原语)。 要获得long价值出来的Long ,调用longValue()就可以了:

Long obj = ...;

long value = obj.longValue();

它是安全的直接铸造它double

如果它实际上是一种原始的long ,那么,你可以强制转换成一个double 。 如果它是一个Long目标,你不需要投,你可以调用doubleValue()就可以了:

double x = obj.doubleValue();


Answer 3:

简单的铸件应完全正常工作。 这将是比通过包装类去,得到的字符串表示,然后解析翻番,再次使用长期价值创造新的实例更快 - 更重要的是,它更具有可读性。

double d = (double)15234451L;


Answer 4:

你可以将它转换为一个Long (因为Object不是 long ,但一Long ),然后投了Longdouble

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);
    }
}


Answer 5:

你只需要一个演员,从对象到长或长(这隐含强制转换为长则适用拆箱):

Object o = 5L;
double d = (long) o; //Apparently only works on Java 7+
//or
double d = (Long) o;


文章来源: Java: many ways of casting a (long) Object to double