泛型:定义:可以在编译时期进行类型检查,避免频繁类型转换,造成运行时错误。
例:
@Test public void testDemo1() throws Exception { List list1 = new ArrayList(); list1.add("Sichuan"); list1.add(1); //不能在编译时,发现异常,但是在运行时会出现转换异常
Integer.parseInt((String)list1.get(0));
List<Integer> list = new ArrayList<Integer>();
//使用泛型,编译时产生异常
list.add("四川");
}
泛型擦除:泛型只在编译时有效,编译后的字节码中无泛型。
注意:泛型类型必须为引用类型,想int,double型不能成为泛型类型。
泛型方法/泛型类/泛型接口:
作用:对公用的业务实现进行抽取,使程序更灵活。
例:泛型方法
public <K> void save(K k){ //使用泛型方法,通过参数确定泛型类型K,在方法内部可以使用泛型K }
泛型类
public class AdminDao<T> { //使用泛型类,确定泛型类型 }
泛型接口
public interface AdminDao<T> { //使用泛型接口,确定泛型类型 }
泛型关键字:? extends super
?:可以接受任何泛型类型,但是不能使用,所以一般在方法参数接受时使用。
extends:限定泛型元素范围,元素类型只能是指定类的子类(上限)
super:指定泛型元素范围,元素类型只能是指定类的父类(下限)(较少使用)
例:extends
private void save (List<? extends Number> list){ } public void testDemo2() throws Exception { //需求:只需要为数字的数组 List<Integer> list1 = new ArrayList<Integer>(); List<Double> list2 = new ArrayList<Double>(); List<Float> list3 = new ArrayList<Float>(); List<String> list4 = new ArrayList<String>(); save(list1); save(list2); save(list3); //当泛型元素类型为String时,编译出现异常,因为String并不是Number的子类 save(list4); }
super:
public void save(List<? super String> list) { } @Test public void testGeneric() throws Exception { // 调用上面方法,必须传入String的父类,所以list3是有通过不了编译 List<Object> list1 = new ArrayList<Object>(); List<String> list2 = new ArrayList<String>(); List<Integer> list3 = new ArrayList<Integer>(); //save(list3); }