4

ジェネリック クラスから呼び出されたメソッドによって返される型を理解する方法はありますか?

例があります:

Generified<Integer, Double> generified = new Generified<Integer, Double>();
Method method = generified.getClass().getMethod("getDoubleValue");
Class<?> returnType = ........

わかりました、クラスがあります:

public class Generified<T, Z> {
    private T tValue;
    private Z doubleValue;
    private List<T> tValueList;

    public Generified() {
    }

    public T gettValue() {
        return tValue;
    }

    public void settValue(T tValue) {
        this.tValue = tValue;
    }

    public Z getDoubleValue() {
        return doubleValue;
    }

    public void setDoubleValue(Z doubleValue) {
        this.doubleValue = doubleValue;
    }

    public List<T> gettValueList() {
        return tValueList;
    }

    public void settValueList(List<T> tValueList) {
        this.tValueList = tValueList;
    }
}

アップデート:

私が求めている理由があります:

コレクションの単純な集計を実行できる lib を実行しようとしています。私が今持っているものがあります:github.README.md

しかし、生成されたクラスのメソッドからの戻り値の型には多くの問題があります。CGLIB でラップし、この戻り値クラスのすべてのメソッドにインターセプターを追加して、呼び出し階層の将来を知るには、実際の戻り値の型を知る必要があります。

しかし、多くのデバッグの後、私がやりたいことを行う方法があることがわかり、泣きたいです:)

4

3 に答える 3

2

Generified を抽象クラスとして宣言することができます。その方法でインスタンス化するには、サブクラスを使用する必要があります。その場合、Generified コンストラクター内で getClass().getGenericSuperclass() を使用して、渡された実際の型パラメーターを取得できます。

package com.stackoverflow.q15998449;

import java.lang.reflect.ParameterizedType;
import java.util.List;

public abstract class Generified<T, Z>
{
    private T tValue;
    private Z doubleValue;
    private List<T> tValueList;

    private final Class<Z> zType;
    private final Class<T> tType;

    @SuppressWarnings("unchecked")
    public Generified()
    {
        ParameterizedType a = ((ParameterizedType) getClass().getGenericSuperclass());
        tType = (Class<T>) a.getActualTypeArguments()[0];
        zType = (Class<Z>) a.getActualTypeArguments()[1];
    }

    public Class<T> getTReturnType()
    {
        return tType;
    }

    public Class<Z> getZReturnType()
    {
        return zType;
    }

    public T gettValue()
    {
        return tValue;
    }

    public void settValue(T tValue)
    {
        this.tValue = tValue;
    }

    public Z getDoubleValue()
    {
        return doubleValue;
    }

    public void setDoubleValue(Z doubleValue)
    {
        this.doubleValue = doubleValue;
    }

    public List<T> gettValueList()
    {
        return tValueList;
    }

    public void settValueList(List<T> tValueList)
    {
        this.tValueList = tValueList;
    }

クラスのユーザーは次のようになります。

package com.stackoverflow.q15998449;

import java.lang.reflect.Method;

public class User
{
    public static void main(String[] args) throws NoSuchMethodException, SecurityException
    {
        Generified<Integer, Double> generified = new Generified<Integer, Double>(){};
        Method method = generified.getClass().getMethod("getDoubleValue");
        Class<?> returnType = generified.getZReturnType();
    }
}
于 2013-04-14T12:34:10.777 に答える
0

何が問題なのかわかりません。.getGenericReturnType()戻り値の型が であることからわかりZます。2 番目のパラメーターZです。Doubleそして、最初の行で具体的なパラメーター を使用してオブジェクトを明示的に作成しています。だからあなたはそれが何であるかを正確に知っています。

于 2013-04-15T02:33:36.237 に答える