我尝试了这段代码,它返回了实际的泛型类型类,因此似乎可以检索到类型信息。但是,这只适用于方法 1 和 2。方法 3 似乎没有像海报所假设的那样返回一个列表类型的字符串,因此失败了。
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try{
Method m = Main.class.getDeclaredMethod("method1", new Class[]{});
instanceOf(m, List.class, String.class);
m = Main.class.getDeclaredMethod("method2", new Class[]{});
instanceOf(m, List.class, String.class);
m = Main.class.getDeclaredMethod("method3", new Class[]{});
instanceOf(m, List.class, String.class);
m = Main.class.getDeclaredMethod("method4", new Class[]{});
instanceOf(m, StringList.class);
}catch(Exception e){
System.err.println(e.toString());
}
}
public static boolean instanceOf (
Method m,
Class<?> returnedBaseClass,
Class<?> ... genericParameters) {
System.out.println("Testing method: " + m.getDeclaringClass().getName()+"."+ m.getName());
boolean instanceOf = false;
instanceOf = returnedBaseClass.isAssignableFrom(m.getReturnType());
System.out.println("\tReturn type test succesfull: " + instanceOf + " (expected '"+returnedBaseClass.getName()+"' found '"+m.getReturnType().getName()+"')");
System.out.print("\tNumber of generic parameters matches: ");
Type t = m.getGenericReturnType();
if(t instanceof ParameterizedType){
ParameterizedType pt = (ParameterizedType)t;
Type[] actualGenericParameters = pt.getActualTypeArguments();
instanceOf = instanceOf
&& actualGenericParameters.length == genericParameters.length;
System.out.println("" + instanceOf + " (expected "+ genericParameters.length +", found " + actualGenericParameters.length+")");
for (int i = 0; instanceOf && i < genericParameters.length; i++) {
if (actualGenericParameters[i] instanceof Class) {
instanceOf = instanceOf
&& genericParameters[i].isAssignableFrom(
(Class) actualGenericParameters[i]);
System.out.println("\tGeneric parameter no. " + (i+1) + " matches: " + instanceOf + " (expected '"+genericParameters[i].getName()+"' found '"+((Class) actualGenericParameters[i]).getName()+"')");
} else {
instanceOf = false;
System.out.println("\tFailure generic parameter is not a class");
}
}
} else {
System.out.println("" + true + " 0 parameters");
}
return instanceOf;
}
public List<String> method1() {
return null;
}
public ArrayList<String> method2() {
return new ArrayList<String>();
}
public StringList method3() {
return null;
}
public <T extends StringList> T method4() {
return null;
}
这输出:
测试方法:javaapplication2.Main.method1
返回类型测试成功:true(预期'java.util.List'找到'java.util.List')
泛型参数匹配数:true(预期 1,找到 1)
通用参数编号 1 个匹配项:真(预期 'java.lang.String' 发现 'java.lang.String')
测试方法:javaapplication2.Main.method2
返回类型测试成功:true(预期'java.util.List'找到'java.util.ArrayList')
泛型参数匹配数:true(预期 1,找到 1)
通用参数编号 1 个匹配项:真(预期 'java.lang.String' 发现 'java.lang.String')
测试方法:javaapplication2.Main.method3
返回类型测试成功:false(预期 'java.util.List' 发现 'com.sun.org.apache.xerces.internal.xs.StringList')
泛型参数匹配数:true 0 个参数
测试方法:javaapplication2.Main.method4
返回类型测试成功:true(预期 'com.sun.org.apache.xerces.internal.xs.StringList' 发现 'com.sun.org.apache.xerces.internal.xs.StringList')
泛型参数匹配数:true 0 个参数