一.泛型(Generic)
目的
为解决元素存储的安全性问题,解决获取数据元素时,需要类型强转的问题。
使用
//Java 新特性
List<Integer> list = new ArrayList<>();
//在集合中使用
List<Integer> list = new ArrayList<Integer>();
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
Map<String, Integer> map = new HashMap<String, Integer>();
Set<Map.Entry<String,Integer>> set = map.entrySet();
for(Map.Entry<String,Integer> s : set){
System.out.println(s.getKey() + s.getValue());
}
//自定义泛型类、泛型接口、泛型方法
//1.当实例化泛型类的对象,指明泛型的类型。指明以后,对应的类中所有使用泛型的位置,都变为实例化中指定的泛型的类型
//2.如果我们自定义了泛型类,但是在实例化时没有使用,那么就默认类型是Object类的
public class LiDong<T> {
private T t;
List<T> list = new ArrayList<>();
public void add(){
list.add(t);
}
public T getT(){
return t;
}
public void setT(T t){
this.t = t;
}
//3.声明泛型方法。当调用泛型方法时,指明泛型方法的类型。
public <E> E getE(E e){
return e;
}
public <E> List<E> fromArrayToList(E[] e,List<E> list){
for(E e1 : e){
list.add(e1);
}
return list;
}
@Override
public String toString() {
return "LiDong [t=" + t + "]";
}
}
//4.继承泛型类或泛型接口时,可以指明泛型的类型
class SubLiDong extends LiDong<Integer> {}
//5.DAO:database access object 数据库访问对象
public class DAO<T> {
public void add(T t){
//...
}
public T get(int index){
return null;
}
public List<T> getForList(int index){
return null;
}
public void delete(int index){}
}
public class CustomerDAO extends DAO<Customer>{}
//泛型与继承的关系
若类A是类B的子类,那么List<A>就不是List<B>的子接口
//通配符 ?
List<A>、List<B>、。。。都是List<?>的子类
? extends A:可以存放A及其子类
? super A:可以存放A及其父类