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

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 に答える