1.泛型的目的
泛型实现了将类型参数化的能力,使代码可以应用于多种类型。从jdk1.5开始,java允许定义泛型类、泛型接口和泛型方法。
2.泛型的优点
使用泛型的主要优点是能够在编译时而不是在运行时检测出程序中的类型转换错误,从而使程序具有一种类型安全的能力。
举个例子:
public class ArrayList{
public Object get(int i){...}
public void add(Object o){...}
}
/**
在使用ArrayList类的时候,由于add方法的参数是Object类型,因此下面的代码是可以通过编译的
*/
ArrayList list = new ArrayList();
files.add("hello.txt");
files.add(new File("world.txt"));
/**
但是这样会面临的问题有:
1.每一次获取list中的元素时都要进行强转,但是由于添加的每个元素类型很可能不尽相同,
无法进行精确的强转,很可能会出现类型转换异常。
*/
3.泛型通配符。
泛型通配符是一个?,当不知道用什么类型来接受类型参数的时候,就可以使用泛型通配符。
看下面的例子:
/**
泛型通配符:
?:代表任意的数据类型
使用方式:
只能作为方法的参数使用
*/
public class _泛型通配符Demo {
public static void main(String[] args) {
//整型list
ArrayList<Integer> integerArrayList = new ArrayList<>();
integerArrayList.add(1);
integerArrayList.add(2);
//字符串list
ArrayList<String> stringArrayList = new ArrayList<>();
stringArrayList.add("a");
stringArrayList.add("b");
printArray(integerArrayList);
printArray(stringArrayList);
}
/**
遍历list,当不知道list使用的是什么数据类型的时候就可以用泛型通配符?来接受数据类型
需要注意的是,泛型没有继承的概念,不能用ArrayList<Object>来接受数据类型
*/
private static void printArray(ArrayList<?> list) {
Iterator<?> iterator = list.iterator();
while(iterator.hasNext()){
Object o = iterator.next();
System.out.println(o);
}
}
}
4.泛型通配符 ----- 受限泛型(指定泛型的上限和下限)
(1)泛型的上限: T<? extends A> 只能接受A类型及其子类
(2)泛型的下限: T<? extends B> 只能接受B类型及其父类