您的位置:首页 > 编程语言 > Java开发

Java获取泛型的类型

2016-08-26 00:00 330 查看
Java的泛型是使用的擦除法实现,泛型的定义只在编译的时候有效,编译之后是没有保留泛型的类型信息的。

然而,擦除法的实现存在一些特列,在这些特例情况下,Java会记录泛型的类型信息,并且可以通过反射的Api来获取。

一)泛型继承

public class TypeTest {
public static void main(String[] args) {
doProxy(Lists.newArrayList(1), new Function<String, Integer>() {
public List<String> execute(Integer request) {
return Lists.newArrayList(String.valueOf(request));
}
});
}

//必须是class,interface获取不到泛型
abstract static class Function<T, F> {
abstract List<T> execute(F request);
}

public static <T,F> List<T> doProxy(List<F> request, Function<T, F> function) {
if (function.getClass().getGenericSuperclass() instanceof ParameterizedType) {
Type mySuperClass = function.getClass().getGenericSuperclass();
Type type = ((ParameterizedType) mySuperClass).getActualTypeArguments()[0];
System.out.println(type);
System.out.println(((ParameterizedType) mySuperClass).getActualTypeArguments()[1]);
}
List<T> list = Lists.newArrayList();
for (F f : request) {
list.addAll(function.execute(f));
}
return list;
}
}

二)方法参数和返回值的泛型

因为需要先通过反射获取Method对象,而反射获取Method对象需要方法名和参数类型,所以

只能获取List<T> method(Set<T> param),这种参数的泛型

不能获取T method(T param),这种参数的泛型

method.getGenericParameterTypes()[0].getActualTypeArguments()[0]
method.getGenericReturnType().getActualTypeArguments()[0]

三)Field的泛型

同方法泛型的原因

只能获取List<T> field,这种属性的泛型

不能获取T field这种属性的泛型

field.getGenericType().getActualTypeArguments()[0]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: