java泛型
泛型简介
泛型是来约束一个类/方法/接口所能存储的类型。指定传入接口/类/方法的类型参数,也就是泛型。泛型==约束,使用<>来约束。注:泛型的类型必须是引用类型,基本类型不能泛型。
泛型的使用
最最常见的泛型使用就是List,我们每次创建list的时候都使用了泛型。如下:
List<String> list = new ArrayList<String>();
规定这个集合只能传入String类型,这就是泛型的一种使用。
泛型也支持多类型,例如最常见的map
HashMap<String, Integer>
传入的时候则需要传入约定的值。
泛型的好处
1. 提高安全性,将运行期的错误转换到编译器,如果我们传入的值不符合泛型,则会编译报错。
2. 存取值的时候省取了强制类型转换的麻烦及不确定性。
泛型的规范
其实泛型的类型参数你可以取任何名字,但最好是单个大写字母,下面是一些约定俗称规范:当然不同公司有不同规范。
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- S、U、V - 2nd、3rd、4th types
有界类型
当我们希望对泛型的类型参数进行限制的时候,可以使用有界类型(Bounded Type Parameters)有界类型参数使用extends关键字后面接上边界类型来表示,注意:这里虽然用的是extends关键字,却不止限制继承了父类,也可以指实现了接口类。
1 package beanCopy; 2 /** 3 * 有界类型 4 * @author wanghao 5 * 6 */ 7 public class BoundedType { 8 private String name; 9 private int age; 10 public String getName() { 11 return name; 12 } 13 public void setName(String name) { 14 this.name = name; 15 } 16 public int getAge() { 17 return age; 18 } 19 public void setAge(int age) { 20 this.age = age; 21 } 22 public <T extends Number> void checkBoundedType(T t) { 23 System.out.println("你输入的是:"+ t); 24 } 25 26 }
上面的最后一个方法,限制传入的类型为Number或Number的子类
public <T extends Number> void checkBoundedType(T t) {
下面是测试类:

因为泛型为必须是Number或Number的子类,所以Boolean放入时,后编译报错。
有界泛型的好处,就是可以调用其父类的方法。
如:

有界泛型也可以多层限制,如下:

用&链接,<T extends A & B & C>
但是多边界使用时其实只能继承一个父类, 并且要将他写在第一个位置上. 其他的都是其实现的接口,
通配符泛型及受限泛型
通配符泛型即无边界泛型,使用?表示。
无边界的通配符,主要是接收不确定的数据。
通配符泛型与基本泛型的区别,
固定上边界泛型
固定上边界的通配符泛型,能够接受其类型与其子类类型数据,采用<? extends E>的形式,这里的E就是该泛型的上臂娜姐,即:类型继承体系除Object的最高点,找个最常用的类吧,List里面的add方法就是使用了上边界泛型。

addAll,合并集合,使用上边界泛型,限制合并集合的泛型必须是本集合的子类或者本身。这样就可以保证集合里面的元素类型一一致。
固定下边界的通配符
使用固定下边界的通配符,能够接受指定类及其父类类型的数据。采用< ? super E>的形式,这里的E就是该泛型的下边界。
注意:你可以为一个泛型指定上边界或下边界,但是不能同时指定上下边界。
例如:


浙公网安备 33010602011771号