一、泛型继承
public abstract class Father<T1,T2> {
}
方式1:保留,泛型子类
1)全部保留
class C1<T1,T2> extends Father<T1,T2> {}
2)部分保留
class C2<T2> extends Father<Integer,T2> {}
方式2:不保留, 按需实现
1)指定具体类型
class C3 extends Father<Integer,String>{}
2)没有类型,擦除 类似于Object
class C4 extends Father {}
注释1:保留父类泛型,子类为泛型子类
注释2:不保留父类泛型,子类按需实现,为非泛型子类
属性及方法的类型,随位置而定:
注释3:子类重写父类的方法,随父类而定;子类中新增方法的类型,随子类而定
注释4:子类中使用父类的属性,随父类而定;子类中使用自己的属性,随子类而定
代码清单1:
public abstract class Father<T1,T2>{
T1 age;
public abstract void test(T2 age);
}
class C1<T1,T2,A,B> extends Father<T1,T2>{
public void test(T2 age) {
}
}
class C2<T2,A,B> extends Father<Integer,T2>{
public void test(T2 age) {
}
}
class C3 extends Father<Integer,String> {
public void test(String age) {
}
}
class C4 extends Father{
public void test(Object age) {
}
}
泛型接口:规则与泛型类一致,接口只包括常量与公共抽象方法。
二、泛型擦除
泛型的擦除指使用时、继承、实现时,不指定具体类型,类似于Object。
三、通配符 上限(extends) 下限(super)
1. ? 符号:
1)通配符,类型不确定,用于声明变量或形参上;
2)不可用在创建对象,以及创建泛型类 泛型方法 泛型接口上
2. 上限 extends:
1)子类约束,一般用于限制操作;
2)不能使用在添加数据上面,一般用在读取操作;
3)规则
class ClassA< T extends ClassB>{
}
方法形式
public void test(List < ? extends ClassB> list){
}
注释1: List <? > list = new ArrayList<ClassB>();
等同于 List < ? extends Object> list = new ArrayList<ClassB>();
3. 下限 super
规则:一般用在下限操作
1)能够添加数据,不能添加父对象;
List<Apple> list1 = new ArrayList<Apple>();
test(list1);
List<Fruit> list2 = new ArrayList<Fruit>();
test(list2);
public static void test(List<? super Apple> list){}
四、泛型嵌套
层次结构,一层层分析即可