1 什么是泛型?
Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常。
泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型。
相关术语:
· ArrayList中的E称为类型参数变量
· ArrayList中的Integer称为实际类型参数
· 整个称为ArrayList泛型类型
· 整个ArrayList称为参数化的类型ParameterizedType
2 特点
· 代码更加简洁【不用强制转换】
· 程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
· 可读性和稳定性【在编写集合的时候,就限定了类型】
。 泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。
3 代码块
泛型方法
public class Demo {
public static void main(String[] args) {
//在集合中的使用。定义集合是,确定及和内部元素锁定类型。
List<String > list = new ArrayList<>();
list.add("abc");
// list.add(10);//类型检查。
for(int i = 0;i<list.size();i++){
System.out.println((String)list.get(i));
}
//调用方法
show("abc");
show(true);
show(123);
show(13.2);
}
//方法泛型
private static <T> void show(T t) {
System.out.println(t);
}
}
泛型类
public class InterImpl<T> implements Intrt<T> {
@Override
public void show(T t) {
System.out.println();
}
public static void main(String[] args) {
//测试一
InterImpl<String> i = new InterImpl();
i.show("hello");
//测试二
//Inter<String> ii = new InterImp<>();
}
}
泛型接口
public interface Intrt<T> {
public abstract void show(T t);
}
接口实现类
public class Test implements Intrt<String>{
@Override
public void show(String s) {
System.out.println(s);
}
}
4 类型通配符
//通配符上限
public void test(List<?> list){
//List集合装载的是Integer,可以调用该方法
List<Integer> integer = new ArrayList<>();
test(integer);
//List集合装载的是String,在编译时期就报错了
List<String> strings = new ArrayList<>();
test(strings);
}
public static void test(List<? extends Number> list) {
}
//通配符下限
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
在泛型的上限和下限中有一个原则:PECS(Producer Extends Consumer Super)书上是这样写的:
带有子类限定的可以从泛型读取【也就是—>(? extend T)】-------->Producer Extends
带有超类限定的可以从泛型写入【也就是—>(? super T)】-------->Consumer Super