我正在构建类似于数据流图的东西,其中包含在它们之间传递数据的节点和连接。在这种情况下,基类是
,它具有前后传递数据的目标。其他类扩展此类以提供数据源,合并数据(例如乘法)等。ValueTarget<T>
现在,我想编写一个从任何给定方法获取其值的数据源。它需要一个ValueTarget<T>
实例(以及调用它的Object和参数)并使用它来设置数据:
java.lang.reflect.Method
现在,我已尝试使用另一个对象的@Override
public T getValue() {
if (valueCalculator != null) {
try {
Object result = valueCalculator.invoke(sourceObject);
T typedResult = (T)(result);
return typedResult;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return super.getValue();
}
方法。但是,在图表中,我需要将此方法映射到public int getLength()
结果。给定的类型转换不会抛出异常,但是当读取最后float
的值并将其结果作为
参数用于另一个方法时,程序崩溃,说明“java.lang。无法将整数强制转换为java.lang.Float“。ValueTarget<Float>
现在,我知道Integer和Float是盒装的,因此无法将其转换为彼此的类型。但是,因为类型都是使用泛型处理的,所以我无法将其拆箱到特定类型。
有没有办法执行通用拆箱,以便能够将盒装值转换为相应的值类型?
答案 0 :(得分:2)
如何使用Number.floatValue()
?
Object result = valueCalculator.invoke(sourceObject);
Float f = ((Number)result).floatValue();
System.out.println(f);
...或者你想要使用它。
这里我假设返回类型是其中之一 - BigDecimal
,BigInteger
,Byte
,Double
,Float
,{{1} },Integer
和Long
(Short
的所有子类)。
答案 1 :(得分:1)
您可以使用Apache CommonBeanUtils库在运行时转换类型。
org.apache.commons.beanutils.ConvertUtils.convert(Object value, Class targetType)
所以你改变了类型代码
T typedResult = (T)(result);
替换为
T typedResult = (T)org.apache.commons.beanutils.ConvertUtils.convert(result, T.getClass());