在JDK1.5之后出现了泛型这个概念,在介绍泛型之前,不妨想想为什么会有泛型这个东西?
例如在泛型出现之前,使用List是这样的
List list = new ArrayList();
我可以往这个list中放任何类型的东西,多方便!你是方便了,但是开发者就难受了,对每个元素都要记得转换类型,不然哪里知道这里面放的什么鬼东西,如果限定某个List只能放某种类型不就好了嘛
所以Java参考了C++模板类的概念,定义一个模板类
public class ArrayListimplements List { }
T可以是任何类型,这样编译器通过用户传入的类型,确定这个List到底是用来放什么的
泛型的实现泛型实现分为膨胀法和擦除法
膨胀法:如果传入的是Integer,那就生成一个List_Integer类,其他类型也一次类推,这个方法的问题就出现在这样干类实在是太多了擦除法:Java里面实际就用的这个方法,用户传入一个T,但是实际Java会擦除这个T,也就是List中存的还是原始的Object对象,当用户去list.get(i)获取对象的时候,自动按照之前传入的T给他做一次转化,例如传入的T是Integer:
Integer i =( Integer )list.get(0)
Java泛型就这么实现了!
泛型和继承有时候我们为了符合一些特殊情况,例如排序
泛型还要实现Comparable接口,才能比较大小
所以使用extend关键字,使得传入的类型是Comparable的子类:
>
我们知道,Java中有多态这个概念,例如水果类Fruit和橘子类Orange,讲道理我们设定方法
public void functionA(Fruit f){
}
传Orange照样是可以传进去的
但是如果按照上面的泛型实现,传的是ArrayList
public void functionA(ArrayListf){ }
因为Fruit是Orange父类,但是ArrayList
所以Java引入了通配符的概念来使得泛型和继承兼容:
例如ArrayList中的addAll方法,这里就使用?extend来兼容Java的多态继承,?就是通配符
public boolean addAll(Collection extends E> c) {
return addAll(this.size, c);
}



