从jdk1.5开始,用泛型来解决元素类型不确定的数据保存操作,通过指定泛型元素类型,在编译的时候就会对类型进行检查,不是泛型的无法添加到这个集合。
泛型实际就是一个用<>引起来的参数类型,这个参数类型具体在使用的时候才会确定类型。
- 使用了泛型后,可以确定集合的类型,在编译的时候就可以检查出来
- 使用泛型可能觉得麻烦,实际上使用泛型才会简单,后续的便利操作会简单许多
- 泛型对应的类型都是引用类型不能是基本类型
泛型擦除和运行时泛型获取
ArrayList<Integer> 或 ArrayList<String>,在编译时都会被编译器擦除成了 ArrayList。这样Java 在创建泛型实例时不创建新的类,从而避免运行时的过度消耗。
获取泛型参数,也仅仅获得了声明时泛型参数占位符。getTypeParameters 方法的 Javadoc 也是这么解释的:仅返回声明时的泛型参数。所以通过 getTypeParamters 无法获得运行时的泛型信息。
<pre>
List list1 = new ArrayList<Integer>();
List list2 = new ArrayList<String>();
System.out.println(list1.getClass() == list2.getClass());//true
List<Integer> list = new ArrayList<Integer>();
Map<Integer, String> map = new HashMap<Integer, String>();
System.out.println(Arrays.toString(list.getClass().getTypeParameters()));//[E]
System.out.println(Arrays.toString(map.getClass().getTypeParameters())); //[K, V]
</pre>
获取泛型类型的方法:
Java 引入泛型擦除的原因是避免因为引入泛型而导致运行时创建不必要的类,那么可以通过定义类的方式,在类信息中保留泛型信息。 即可以在变量定义后面加一对大括号从而创建一个匿名内部类。 所以,Java 的泛型擦除是有范围的,即类定义中的泛型是不会被擦除的。
<pre>
Map<String, Integer> map = new HashMap<String, Integer>() {};
Type type = map.getClass().getGenericSuperclass();
ParameterizedType parameterizedType = ParameterizedType.class.cast(type);
for (Type typeArgument : parameterizedType.getActualTypeArguments()) {
System.out.println(typeArgument.getTypeName()); //java.lang.String ,java.lang.Integer
}
</pre>
<pre>
ResponseEntity<YourType> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<YourType>() {});
</pre>
1670

被折叠的 条评论
为什么被折叠?



