Java泛型

从jdk1.5开始,用泛型来解决元素类型不确定的数据保存操作,通过指定泛型元素类型,在编译的时候就会对类型进行检查,不是泛型的无法添加到这个集合。

泛型实际就是一个用<>引起来的参数类型,这个参数类型具体在使用的时候才会确定类型。

  1. 使用了泛型后,可以确定集合的类型,在编译的时候就可以检查出来
  2. 使用泛型可能觉得麻烦,实际上使用泛型才会简单,后续的便利操作会简单许多
  3. 泛型对应的类型都是引用类型不能是基本类型

泛型擦除和运行时泛型获取

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>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值