泛型 JDK5
1、泛型概述
是JDK 5的新特性(JDK 1.5)
1)创建集合对象,可不使用泛型
好处:
- 集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据
弊端:
- 不安全,容易发生异常
public static void mian(Stirng[] args){
ArrayList list = new ArrayList();
list.add("abc");
list.add(1);
System.out.println(list.length()); // 这里会报错,抛出异常,因为存储的类型不同
}
2)创建集合对象,使用泛型
好处:
- 避免了类型转换的麻烦,存储什么类型,取出的就是什么类型
- 把运行期异常,转到了编代码期
弊端:
- 泛型是什么类型,就只能存储什么类型
2、自定义泛型
自定义泛型类
public class GenericClass<E>{
private E value;
public E getValue(){
return value;
}
public void setValue(E value){
this.value = value;
}
}
此处类后面加了一个<E>就是泛型。
含有泛型的方法
格式:
修饰符 <泛型> 返回值类型 方法名(参数列表(使用泛型)){方法体; }
泛型方法,可根据传递的参数来确定是什么类型。
public class GenericMethod{
// 定义一个含有泛型的方法
public <M> void method01(M m){
System.out.println(m);
}
// 定义一个含有泛型的静态方法
public static <S> void method02(S s){
System.out.println(s);
}
}
含有泛型的接口
public interface GenericInterface<E> {
public abstract void method(E e);
}
可通过继承接口,然后对接口的泛型进行指定
3、泛型通配符
泛型通配符:?
泛型通配符只能通过参数传递使用。不具备存储功能。
public class Test{
public static void main(String[] args){
ArrayList<Integer> listInt = new ArrayList<>();
listInt.add(1);
listInt.add(2);
ArrayList<String> listStr = new ArrayList<>();
listStr.add("a");
listStr.add("b");
printArray(listInt);
printArray(listStr);
}
public static void printArray(ArrayList<?> list){
Iterator<?> inter = list.Interator();
while(inter.hasNext()){
System.out.println(inter.next());
}
}
}
4、泛型高级使用,上限下限
泛型的上限 限定:Collection<? extends Object>
此时的泛型必须是Object的子类或者本身
泛型的下限 限定:Collection<? super Object>
此时的泛型必须是Object的父类或者本身
public class Test{
public static void main(String[] args){
// 注意:从JDK 1.7 开始,右侧的尖括号内可以不写泛型,但本身是要写的。
Collection<Integer> listInt = new ArrayList<>();
Collection<String> listStr = new ArrayList<>();
Collection<Number> listNum = new ArrayList<>();
Collectiont<Object> listObj = new ArrayList<>();
getElm1(listInt);
getElm1(listStr); // 报错
getElm1(listNum);
getElm1(listObj); // 报错
getElm2(listInt); // 报错
getElm2(listStr); // 报错
getElm2(listNum);
getElm2(listObj);
}
public static void getElm1(Collection<? extends Number>){}
public static void getElm2(Collection<? super Number>){}
}
}