我想使用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] 删除。
我来说两句