一、泛型的作用
简单地说,泛型的作用是为了统一集合中存放的数据类型。
我们知道数组中可以存放任意数据类型,但存放的数据类型要一致,而集合中存储的数据类型可以不一致。也就是说,String类型和Integer类型的数据可以同时存放在一个集合中。
那么这样就很可能会出现问题,当某一个只打算存放String类型数据的集合中不小心混入一个Integer类型的数据,编译也不会进行报错。 因为集合本来就可以存放多种数据类型,但是程序员可能以为集合中存放的只有String类型的数据。
这个时候,就需要使用到泛型来规范集合存放的数据类型了。在创建集合时先说清楚,只能存放String类型的数据,这时候若存储其他类型的数据编译就会报错。
泛型的作用是一种安全机制,是一种书写规范,它和接口的作用有着一定的类似,都是在制定规则。
二、泛型的使用
泛型的使用主要有四种,分别为泛型类、泛型接口、泛型方法以及泛型通配符。
1、泛型类 格式:修饰符 class 类名<代表泛型的变量> { }
例如:
public class ArrayList<E>{}
其中E来代表泛型的变量,E本身并没有含义,任意一个大写字母都可以。
2、泛型接口 格式:修饰符 interface 接口名<代表泛型的变量> {}
例如:
public interface MyInterface<E>{}
3、泛型方法 格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){}
例如:
public <A> A show(A a) {}
4、泛型通配符 当不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。 其中泛型通配符还可以这样使用:
1)上界通配符 < ? extends E> 上界:用 extends 关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。如:<? extends Person>:表示可以传递Person及其子类
2)下界通配符 < ? super E> 下界: 用 super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至 Object。如:<? super Person>:表示可以传递Person及其父类
举一个常见的例子: 未使用泛型:
List list = new ArrayList();
list.add(1);
list.add("string");
使用泛型:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
|