一、泛型类和泛型接口
1.如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型。
2.要求:如果大家定义了类带了泛型的,建议在实例化时要指明类的泛型。
3.由于子类在继承带泛型的父类时,如果父类指明了泛型类型。则实例化子类对象时,不再需要指明泛型。子类不是泛型类。
public class SubOrder extends Order<Integer> {
}
4.由于子类在继承带泛型的父类时,如果父类不指明泛型类型。是泛型类(例:ArrayList)
public class SubOrder1<T> extends Order<T> {
}
1.泛型类可以有多个参数,此时应将多个参数一起放在尖括号内。比如:<E1,E2,E3>
2.泛型类的构造器如下:public GenericClass() {},错误的是public GenericClass<E>() {}
3.实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。
4.泛型不同的引用不能相互复制。
5.泛型如果不指定,将被擦除,泛型对应类型均按照Object处理,但不等价与Object。经验:泛型要使用一路都用。要不用,一路都不要用。
6.如果泛型结构是一个接口或抽象类,则不可以创建泛型类的对象。
7.jdk1.7,泛型的简化操作:ArrayList<Fruit> flist = new ArrayList<>();
8.泛型的指定中不能使用基本数据类型,可以使用包装类替换。
9.在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类型,非静态方法的参数类型,非静态防范的返回值类型,但在静态方法中不能使用类得泛型。
10.异常类不能是类的泛型
11.不能使用new E[]。但是可以: E[] elements = (E[])new Object[capacity]; 参考:ArrayList源码中声明:Object[] elementData,而非泛型参数类型数组。
12.父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型:
子类不能保留父类的泛型:按需实现
没有类型 擦除
子类保留父类的泛型:泛型子类
全部保留
部分保留
1.png
结论:子类必须是“富二代”,子类除了指定或保留父类的泛型,还可以增加自己的泛型。
二、泛型方法
泛型方法:在方法中出现了泛型的结构,泛型参数与类得泛型参数没有任何关系。
泛型方法可以声明为静态的,原因:泛型参数是在调用方法的时候确定的,并不是实例化类时确定的。
//泛型参数
public <E> List<E> copyFromArrayToList(E[] arr) {
}
三、泛型在继承方面的体现
泛型在继承方面的体现
虽然类A是类B的父类,但是G<A>和 G<B>二者不具备子父类关系,二者是并列关系。
补充:类A是类B的父类,A<G>是B<G>的父类
//如下代码:这种写法时错误的,此时list1(List<Object> )和list2(List<String> )的类型不具又子父类关系。虽然Object是String的父类。
List<Object> list1 = null;
List<String> list2 = null;
list1 = list2
证明反证法: list1=list2;假设list1=list2,list1.add(123);导致非String的数据混入。出错
四、通配符的使用
类A是类B的父类,但是G<A>和 G<B>二者没有关系,G<?>是G<A>和 G<B>的父类
对于List<?>就不能向其内部添加数据了,除了添加null之外。
List<Object> list1 = null;
List<String> list2 = null;
List<?>
list1 = list2
1609216469(1).png
1609216767(1).png










网友评论