1

我正在构建类似于数据流图的东西,其中包含在它们之间传递数据的节点和连接。在这种情况下,基类是ValueTarget<T>,它有一个前一个目标和一个下一个目标来来回传递数据。其他类扩展该类以提供数据源、合并数据(例如乘法)等。

现在,我想编写一个从任何给定方法获取其值的数据源。它接受一个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结果。给定的类型转换不会抛出异常,但是当读取 lastValueTarget<Float>的值并将其结果用作float另一个方法的参数时,程序崩溃,说明“java.lang.Integer 无法转换为 java.lang.Float ”。

现在,我知道 Integer 和 Float 是装箱的,因此不能转换为彼此的类型。但是,由于这些类型都是使用泛型处理的,因此我无法将其拆箱为特定类型。

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

4

2 回答 2

2

怎么用Number.floatValue()

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

...或者您想使用它。

在这里,我假设返回类型是其中之一 - BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, 和Short(它们都是 的子类Number)。

于 2013-09-17T14:11:11.963 回答
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());
于 2013-09-17T14:05:27.497 回答