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;
    }
}

更新:

这就是我要求的原因:

我正在尝试做可以对集合进行简单聚合的库。这就是我现在所拥有的:github.README.md

但是我对泛型类方法的返回类型有很多问题。我需要知道真正的返回类型才能用 CGLIB 包装它,并为这个返回类的所有方法添加拦截器,以便将来知道调用层次结构。

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

4

3 回答 3

2

答案从方法名就很明显了——getDoubleValue()应该返回Double。但是由于您没有为该类提供代码,我们只能猜测。

但是,如果您在这里谈论一般情况,则反射只能走这么远: Method.getReturnType()Method.getGenericReturnType()

更新: 如果您MethodSpy此页面上查看并针对您的班级运行它,您将获得:

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

我认为您无法仅通过查看泛型类来找到所需的内容,它只是不包含您需要的信息。希望这可以帮助。

于 2013-04-14T11:21:02.200 回答
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. 你知道Z的是第二个参数。Double并且您在第一行中显式地创建了一个带有具体参数的对象。所以你确切地知道它是什么。

于 2013-04-15T02:33:36.237 回答