为什么要使用泛型?
设想你有很多数字要进行排序,你选择把数字先放到下面的集合中
ArrayList list = new ArrayList();
你当然可以往里面加数字,但你添加字符串编译时也不报错,可是list里面有字符串显然不是你想见到的。
list.add("hello");
JVM虚拟机在执行排序时当然无法把数字与字符串排序,会产生一个运行时错误,这使你无法完成对数字的排序。要是能在编译时就发现错误就好了,怎么实现呢?面对这个问题jdk1.5提出的泛型发挥了作用,如下创建集合list即可。<Integer>限制了集合中只能存放Integer类型的数据,此时你添加字符串编译就会报错。
ArrayList<Integer> list = new ArrayList<>();
可以说,使用java泛型的动机就是在编译时检测出错误。
下面来谈谈怎样使用泛型类、泛型接口、泛型方法。一般用<T>表示泛型,T可以是广泛的任意类型的数据。
泛型类
public class myFanXing<E>{ private int name; private ArrayList<E> list = new ArrayList<>(); public myFanXing(){//构造方法不带泛型 } }
public calss male<T>{ public T eat(); }
泛型方法
我们在上面的泛型类中写一个泛型方法
其中<T>标记此方法为泛型方法,T表明方法返回T类型的数据,do(T t)表明需要给方法传递T类型的参数。
public class myFanXing<T>{ public static <T> T do(T t){ //方法体 } }
泛型通配符
上面的尖括号<>中还可以放以下3种形式的符号
<?> 非受限通配 它可以表示任何一种对象类型
<? extends T> 它可表示a或a的子类型的通配类型。
<? super T> 它表示T的父类型