使用递归调用确定泛型类型

时间:2017-01-17 11:19:31

标签: java generics reflection

我有一个有两个参数的方法:

public <P, T> T getT(P p, Class<T> returnType) {
    //This method converts p to an instance of the type T.
}

或多或少,代码遍历returnType的所有setter并在p上调用getter方法:

T t = new T();
t.setBla(p.getBla());

现在,在循环遍历T类的所有setter时,我遇到了一个Collection。我想以递归方式为集合中的每个项目调用自己的方法。 我的问题是,我无法指定返回类型,因为我无法弄清楚我收到的Collection的返回类型。像这样的东西(没有反射的伪代码):

for(Object o : list) {
    return getT(o, ???);
}

我尝试使用自定义注释来解决它,其中我指定了该集合的returnType,但我不能在我的注释中使用泛型:

public @interface ReturnType {
    public Class<?> value();
}

所以我在getT()中的论点并不匹配。如何在不更改getT()方法的泛型类型的情况下修复此问题(getT(P p,Class t))?

1 个答案:

答案 0 :(得分:1)

如果你可以将你的泛型指定为另一个类的扩展,你可以改为写下这样的东西:

public <P, T> T getT(P p, Class<T extends SomeClass> returnType){
//code
}

然后

for(Object o : list) {
return getT(o, SomeClass.class);
}

public @interface ReturnType { 
public Class<SomeClass> value();
}