Java获取泛型的类型
2016-08-26 00:00
330 查看
Java的泛型是使用的擦除法实现,泛型的定义只在编译的时候有效,编译之后是没有保留泛型的类型信息的。
然而,擦除法的实现存在一些特列,在这些特例情况下,Java会记录泛型的类型信息,并且可以通过反射的Api来获取。
一)泛型继承
二)方法参数和返回值的泛型
因为需要先通过反射获取Method对象,而反射获取Method对象需要方法名和参数类型,所以
只能获取List<T> method(Set<T> param),这种参数的泛型
不能获取T method(T param),这种参数的泛型
三)Field的泛型
同方法泛型的原因
只能获取List<T> field,这种属性的泛型
不能获取T field这种属性的泛型
然而,擦除法的实现存在一些特列,在这些特例情况下,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]
相关文章推荐
- java 通过反射获取泛型的类型
- java基础-反射 --通过反射 获取泛型实际类型参数
- java 通过反射获取泛型的类型
- java获取泛型的实际类型
- 如何获取java中泛型参数的实际类型--反射获取
- Java获取泛型参数的类型的方法 .
- ParameterizedType获取java泛型参数类型
- java 通过反射获取泛型的类型
- java中获取泛型参数类型
- java 获取泛型的类型
- java 多个泛型的类型获取方法
- java 中获取泛型类型
- java 通过反射获取泛型的类型
- java 获取 泛型类型(接口及超类)
- Java获取泛型参数的类型的方法
- java获取泛型类型
- 获取java泛型参数类型
- java 通过反射获取泛型的类型
- java 通过反射获取泛型的类型
- java获取泛型参数实际类型