我想使用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发送。如果这是最终目标,是否有更好的方法来实现上述目标?
答案 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)。考虑到你很可能想以某种方式格式化你的价值,我认为你不应该采取任何捷径。