3.在声明时指定类型,但不能是基本类型
泛型的继承 * 1.保留父类的泛型,泛型子类 * 2.不保留父类泛型,子类按需实现即可,可以是泛型类也可以是非泛型类 * 3.子类也可以扩展自己的泛型也可以 * 4.子类重写的方法的泛型类型取决于父类中该方法的泛型类型 * 5.子类中使用父类的属性随父类而定 * 6.子类新增方法或属性的类型由子类自己决定
public abstract class Father4<T1, T2>{ T1 age; public abstract void test(T2 name); } /* * 保留-->泛型子类 */ //1)全部保留 class c1<T1, T2> extends Father4<T1, T2>{ @Override public void test(T2 name) { //this.age-->T1 } } //2)部分保留 class c2<T2> extends Father4<Integer, T2>{ @Override public void test(T2 name) { //this.age-->Integer } } /* * 不保留--》按需实现 */ //1)指定具体类型 class c3 extends Father4<Integer, String>{ @Override public void test(String name) { //this.age-->Integer } } //2)没有类型,擦除泛型,擦出后相当于Object class c4 extends Father4{ @Override public void test(Object name) { //this.age-->Object } } class c5<T1, T2, A, B> extends Father4<T1, T2>{ @Override public void test(T2 name) { //this.age-->T1 } }泛型接口与泛型类同理
“?“ 通配符:类型不确定,用于声明变量|形参 1、变量的类型(局部变量&成员变量)
List<? extends Fruit> list1 =new ArrayList<Fruit>();2、方法形参的类型
public stati cvoid test(List<?> list)===================================
public class ExtendsTest8 { public static void main(String[] args) { Test<Fruit8> t1=new Test<Fruit8>(); Test<Apple> t2=new Test<Apple>(); Test<Pear> t3=new Test<Pear>(); Test<FujiApple> t4=new Test<FujiApple>(); //调用方法 List<? extends Fruit8> list1=new ArrayList<Fruit8>(); test(list1); List<Apple> list2=new ArrayList<Apple>(); test(list2); //? extends Apple List<? extends Apple> list4=new ArrayList<FujiApple>(); test(list4); //?-->为什么错误 List<?> list5=new ArrayList<Apple>(); //test(list5); List<?> list6=new ArrayList<Object>(); //test(list6); //? 相当于任何类型的对象都可以,假设对象超出Fruit8,如Object, //所以 声明对象时用 ,即使创建对象时使用的泛型在Fruit8内也不行 } //? extends Fruit8 public static void test(List<? extends Fruit8> list){ //不能向list添加任何对象 //list.add(new Apple()); //list.addAll(new Pear()); list.add(null); } } class Test<T extends Fruit8>{}//extends表示泛型上限为Fruit8,T可以是所有Fruit8的子类