Java反射。将返回值转换为双精度

不来梅

我想使用Java反射将方法的返回值转换为double,而不管实际的返回类型是Number还是原始的int,long,float,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)。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)。反射会自动为您装箱原语因此,有一种更好的方法可以完成此操作:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章