我有以下代码段(仅作示例):
public class Class123 extends Thread implements Serializable, Runnable {
public <T extends String> T callFriend(String name, Class<T> type) {
return "";
}
}
是否可以获得<T extends String> T
?
method.getGenericReturnType() == "T"
method.getReturnType().getName() == "java.lang.String"
我的第二个例子是:
public abstract class Function<T, R> {
public <V> Function<T, V> then(Function<? super R, ? extends V> after) {
return new Function<T, V>() {
@Override
public V apply(T t) {
return after.apply(Function.this.apply(t));
}
};
}
public abstract R apply(T t);
}
我想得到:<V> Function<T, V>
。
答案 0 :(得分:4)
当你说你想要这个<V> Function<T, V>
时,这就是你要找的东西(我猜是这样,因为很明显这个类型会被删除)
Method andThen = Function.class.getDeclaredMethod("then", Function.class);
Type t = andThen.getGenericReturnType();
ParameterizedType claz= (ParameterizedType)t;
System.out.println(claz);
System.out.println(Arrays.asList(claz.getActualTypeArguments()));
打印:
Function<T, V>
[T, V]
同样适用于您的第一个案例。举个例子,您也可以为变量而不仅仅是方法:
class Outer{
//Aim is to capture the type of generic type below. i.e. String
List<String> ls = new ArrayList<String>();
}
Field field = Outer.class.getDeclaredField("ls");
ParameterizedType p = (ParameterizedType) field.getGenericType();
Class<?> claz = (Class<?>)p.getActualTypeArguments()[0];
System.out.println(claz);
// prints class java.lang.String
这也是我为自己写的class,它更容易捕获泛型类的类型。万一有帮助