Java反射。将返回值转换为double

时间:2017-02-13 11:39:05

标签: java reflection

我想使用Java反射将方法的返回值转换为double,无论实际的返回类型是数字还是原始int,long,float,double等。

为了确保该方法实际返回一个我可以转换为double的值,我正在使用

List<String> numberTypes = Arrays.asList("int", "Integer", "double", "Double", "long", "Long", "float", "Float");
if (numberTypes.contains(method.getReturnType().getSimpleName())){
    Double a = new Double( method.invoke(obj) );
}

但是Eclipse在这里告诉我,它希望我将invoke的输出设置为Double。基本上它要我这样做......

if (numberTypes.contains(method.getReturnType().getSimpleName())){
    Double a = new Double( (Double) method.invoke(obj) );
}

但是在我看来,我可能会引入一个错误,因为如果对象实际上是一个原始的int(例如),那么在我看来,演员阵容是不正确的。所以开放性问题:

1)我应该插入演员?

2)有没有更好的方法将返回值转换为Double?

3)如果最终的目标是将Double转换为String,那么我可以在这里使用快捷方式吗?例如,可能会发现我们最终只需要通过网络将值作为String发送。如果这是最终目标,是否有更好的方法来实现上述目标?

1 个答案:

答案 0 :(得分:1)

1)。 Java使用编译时多态来进行重载 - 在编译期间确定要运行的重载方法。

例如:

static double f(Integer x) { ... }
static double f(Double x) { ... }

// somewhere in the code:
Object h = new Double(14.0);
f(h); // won't compile - unable to determine which method you want to invoke
f((Integer)h); // will compile, but fail at run-time with ClassCastException
f((Double)h); // will compile and succeed.

这就是Eclipse告诉你执行强制转换的原因 - 它需要知道要调用哪个确切的构造函数(Double有两个构造函数 - 一个接受String,另一个接受double)。

现在我认为应该很清楚,你不能简单地转换为Double(因为你可能有其他类型的价值),所以你不应该只是插入演员。

2)。反思automatically boxes primitives for you。所以有一种更好的方法来实现这一目标:

double a = ((Number)method.invoke(obj)).doubleValue();

3)。考虑到你很可能想以某种方式格式化你的价值,我认为你不应该采取任何捷径。