1.泛型概念
当存储的类型比较大,比如是 Object 类型时,可以使用泛型向下指定
配合 Object, 泛型可以很方便的指定某种数据类型
官方并没有对泛型准确的定义,这里做一个定义
泛型的概念:泛型是限定数据类型的一种手段。
2.泛型的语法
1泛型类的定义
在类后面加一个<E>,并且把属性和方法定义为 E 类型
在创建类的时候,确定E的数据类型,如果不写,默认是 Object
public class GeneClass<E>{
private E name;
public E getName(){
return name;
}
public void setName(E name){
this.name = name;
}
}
2.泛型方法的定义
在返回值类型前,在static 后的位置,加上<E>
在调用方法时,确定传递的数据类型,默认是 Object
public <M> void method1(M m){
System.out.println(m);
}
public static <S> void method2(S s){
System.out.println(s);
}
3.泛型接口的定义
分别有接口类本身 和 实现类的泛型定义
//接口类本身的定义
public interface Iterator<E>{
E next();
}
//实现类在实现时指定泛型
public final class Scanner implements Iterator<String>{
public String next(){}
}
//实现类本身定义和使用接口的泛型,此时必须使用相同的字母
public class ArrayList<E> implements List<E>{
public boolean add(E e){}
public E get(int index){}
}
4.泛型的通配符 “?”
通配符 ? 代表任意数据类型
无法创建对象使用,只可以使用方法时传递参数使用
public static void printArray(ArrayList<?> list){
Iterator<?> it = list.iterator();
while(it.hasNext()){
Object o = it.next();
System.out.println(o);
}
}
5.泛型的上限和下限限定
使用 ? extends E ,表示 E 是父类,? 只能是子类(或者它本身)
使用 ? super E ,表示 ? 是父类(或者它本身),无法使用子类
//泛型的上限?必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
//泛型的下限?必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}