泛型的继承
●泛型不具备继承性,但是数据具备继承性
public class GenericsDemo5 { public static void main(String[] args) { ArrayList<Ye> list1 = new ArrayList<>(); ArrayList<Fu> list2 = new ArrayList<>(); ArrayList<Zi> list3 = new ArrayList<>(); // method(list1); // method(list2);//报错 // method(list3);//报错 list1.add(new Ye()); list1.add(new Fu()); list1.add(new Zi()); } //此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。 public static void method(ArrayList<Ye> list){ } } class Ye{} class Fu extends Ye{} class Zi extends Fu{}
希望:本方法虽然不确定类型,但是以后我希望只能传递指定类型
此时我们就可以使用泛型的通配符:
?也表示不确定的类型,他可以进行类型的限定
? extends E:表示可以传递E或者E所有的子类类型
? supler E:表示可以传递E或者E所有的父类类型
public class GenericsDemo5 { public static void main(String[] args) { ArrayList<Ye> list1 = new ArrayList<>(); ArrayList<Fu> list2 = new ArrayList<>(); ArrayList<Zi> list3 = new ArrayList<>(); method(list1); method(list2); method(list3); } public static void method(ArrayList<? super Zi> list){ } } class Ye{} class Fu extends Ye{} class Zi extends Fu{}
应用场景:
1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符
泛型的通配符:
关键点:可以限定类型的范围。
通配符综合练习代码:
动物类
public abstract class Animal { private String name; private int age; public Animal(){ } public Animal(String name,int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public abstract void eat(); @Override public String toString() { return "Animal{" + "name='" + name + '\'' + ", age=" + age + '}'; } } 猫 public abstract class Cat extends Animal{ public Cat(String name,int age){ super(name, age); } //1.继承抽象类,重写里面的所有抽象方法 //2.本身Cat也是一个抽象的,让Cat的子类重写重写方法 //采取第二种方法 //因为猫的两个子类中的eat的方法还是不一样的 }
狗 public abstract class Dog extends Animal{ }
public class HuskyDog extends Dog{ @Override public void eat() { System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的哈士奇,正在吃骨头,边吃边拆家"); } }
public class TedyDog extends Dog{ @Override public void eat() { System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的泰迪,正在吃骨头,边吃边蹭"); } }
public class PersianCat extends Cat{ public PersianCat(String name,int age){ super(name,age); } @Override public void eat() { System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的波斯猫,正在吃小饼干"); } }
public class LiHuaCat extends Cat{ public LiHuaCat(String name,int age){ super(name,age); } @Override public void eat() { System.out.println("一只叫"+getName()+"的,"+getAge()+"岁的狸花猫,正在吃鱼"); } }
测试 public class Test1 { public static void main(String[] args) { ArrayList<PersianCat> list1 = new ArrayList<>(); ArrayList<LiHuaCat> list2 = new ArrayList<>(); ArrayList<TedyDog> list3 = new ArrayList<>(); ArrayList<HuskyDog> list4 = new ArrayList<>(); list1.add(new PersianCat("小花",10)); list2.add(new LiHuaCat("小白",11)); keePet(list1); keePet(list2); // keePet(list3); // keePet(list4); } /* //该方法能养所有动物,但不能传递其他类型 public static void keePet(ArrayList<? extends Animal> list){ //遍历集合,调用动物eat方法 } */ /* //该方法能养所有品种的狗,但是不能养猫 public static void keePet(ArrayList<? extends Dog> list){ } */ //该方法能养所有品种的猫,但是不能养狗 public static void keePet(ArrayList<? extends Cat> list){ for (Cat cat : list) { cat.eat(); } } }