从泛型类调用的方法将返回什么类型?

时间:2013-04-14 11:15:34

标签: java generics reflection

有没有办法了解从泛型类调用的方法将返回什么类型?

有一个例子:

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

但是我对来自generified类的方法的返回类型有很多问题。 我需要知道实际的返回类型,用CGLIB包装它,并为此返回类添加拦截器,以便将来知道调用层次结构。

但经过大量的调试后,我发现现在有办法做我想做的事,我想哭:)

3 个答案:

答案 0 :(得分:2)

答案显而易见,方法名称 - getDoubleValue()应该返回Double。但由于你没有提供该类的代码,我们只能猜测。

但如果你在这里谈论一般情况,反思只能到目前为止: Method.getReturnType()Method.getGenericReturnType()

<强>更新 如果您在this page上查看MethodSpy并针对您的课程运行,则会获得:

public Z Generified.getDoubleValue()
    ReturnType: class java.lang.Object
    GenericReturnType: Z

我认为只要查看泛型类就不能找到你想要的东西,它只是不包含你需要的信息。希望这会有所帮助。

答案 1 :(得分: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();
    }
}

答案 2 :(得分:0)

我不明白问题是什么。您从.getGenericReturnType()知道返回类型为Z。你知道Z是第二个参数。并且您在第一行显式创建了具有具体参数Double的对象。所以你确切地知道它是什么。