有没有办法了解从泛型类调用的方法将返回什么类型?
有一个例子:
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包装它,并为此返回类添加拦截器,以便将来知道调用层次结构。
但经过大量的调试后,我发现现在有办法做我想做的事,我想哭:)
答案 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
的对象。所以你确切地知道它是什么。