一、概述
1、没有泛型:编译时不报错,运行时报错ClassCastException
2、泛型好处:编辑期检查、减少了数据类型转换
3、泛型的本质就是参数化类型,也就是定义形参。
二、泛型类
1、创建对象的时候指定具体的数据类型
2、泛型类,如果没有指定具体的数据类型,此时,操作类型是Object
3、泛型的类型参数只能是引用类型,不能是基本数据类型,如:int
4、同一个泛型类,根据不同的数据类型创建的对象,本质上是同一个类型(同一个class对象)。
注:可以结合后面的泛型擦除理解,泛型擦除之后 Generic < String > 和Generic< Integer >都是Generic类。
5、泛型类中可以有多个泛型,例:class Generic<K,V>
三、从泛型类派生子类
1、子类也是泛型类,子类和父类的泛型类型要一致,例:class ChildGeneric<T> extends Generic<T>
2、子类不是泛型类,父类要明确泛型的数据类型,例:class ChildGeneric extends Generic<String>
四、泛型接口
1、实现类也是泛型类,实现类和接口的泛型类型要一致,例:class Pair<T,E> implements Generator<T>
2、实现类不是泛型类,接口要明确数据类型,例:class Apple implements Generator<String>
五、泛型方法
1、public static <T,E,K> void printType(T t, E e, K k)--->public与返回值中间的泛型声明(<T,E,K>)非常重要,可以理解为声明此方法为泛型方法。
六、类型通配符(?)
1、类型通配符是类型实参,同String、Integer
2、通配符的上限:<? extends 实参类型>,例:ArrayList.public boolean addAll(Collection<? extends E> c)
3、通配符的下限:<? super 实参类型>,例:TreeSet.public TreeSet(Comparator<? super E> comparator)
七、类型擦除
1、泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为–类型擦除。
2、无限制类型擦除:public T getKey()---->public Object getKey()
3、有限制类型擦除:public <E extends Number> E getValue(E value)---->public Number geValue(Number value)
八、泛型数组
1、可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象
2、创建1:ArrayList<String>[] listArr = new ArrayList[5];
3、创建2:
public class Fruit<T> {
public T[] array;
public Fruit(Class<T> clazz, int len) {
array = (T[])Array.newInstance(clazz, len);
}
}
4、开发时尽量不要使用泛型数组,而用泛型集合
九、