Java:将存储在Object中的值拆箱为未知类型

时间:2013-09-17 13:55:35

标签: java generics boxing autoboxing unboxing

我正在构建类似于数据流图的东西,其中包含在它们之间传递数据的节点和连接。在这种情况下,基类是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的值并将其结果作为ValueTarget<Float>参数用于另一个方法时,程序崩溃,说明“java.lang。无法将整数强制转换为java.lang.Float“。

现在,我知道Integer和Float是盒装的,因此无法将其转换为彼此的类型。但是,因为类型都是使用泛型处理的,所以我无法将其拆箱到特定类型。

有没有办法执行通用拆箱,以便能够将盒装值转换为相应的值类型?

2 个答案:

答案 0 :(得分:2)

如何使用Number.floatValue()

Object result = valueCalculator.invoke(sourceObject);
Float f = ((Number)result).floatValue();
System.out.println(f);

...或者你想要使用它。

这里我假设返回类型是其中之一 - BigDecimalBigIntegerByteDoubleFloat,{{1} },IntegerLongShort的所有子类)。

答案 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());