一、通配符:
泛型不具备继承性,数据具备继承性
package a05mygenericsdemo;
import java.util.ArrayList;
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方法
method(list1);
// method(list2);//报错,因为泛型不具备继承性,下面method方法中泛型写的是Ye所以只能传递Ye类型
// 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{}
//弊端:
//利用泛型方法可以接受任意的数据类型
//但希望本方法虽然不确定类型,但是以后希望只能传递Te Fu Zi
//此时可以使用泛型通配符:
// ?也表示不确定的类型,它可以进行类型的限定
// ? extends E:表示可以传递E或者E所有的子类类型
// ? super E:表示可以传递E或者E所有的父类类型
代码演示:
package a05mygenericsdemo;
import java.util.ArrayList;
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方法
method(list1);
method(list2);//报错,因为泛型不具备继承性,下面method方法中泛型写的是Ye所以只能传递Ye类型
method(list3);//报错
list1.add(new Ye());
list1.add(new Fu());//不报错,因为数据具备继承性
list1.add(new Zi());//不报错
}
public static void method(ArrayList<?> list){
}
}
class Ye{}
class Fu extends Ye{}
class Zi extends Fu{}
通配符应用场景:
1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。
2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以用泛型的通配符
泛型的通配符的关键点:可以限定类型的范围
二、综合练习:
定义一个继承结构:猫,狗继承动物类;波斯猫,狸花猫继承猫类;泰迪,哈士奇继承狗类
属性:名字,年龄
行为:吃东西
方法体打印:一只叫做xxx的,x岁的波斯猫,正在吃小饼干
方法体打印:一只叫做xxx的,x岁的狸花猫,正在吃鱼
方法体打印:一只叫做xxx的,x岁的泰迪,正在吃骨头,边吃边蹭
方法体打印:一只叫做xxx的,x岁的哈士奇,正在吃骨头,边吃边拆家
测试类中定义一个方法用于饲养动物
public static void keepPet(ArrayList<???> list){
//遍历集合,调用动物的eat方法
}
要求1:该方法能养所有品种的猫,但是不能养狗
要求1:该方法能养所有品种的狗,但是不能养猫
要求1:该方法能养所有的动物,但是不能传递其他类型
Animal类:
package a05mygenericsdemo;
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();
public String toString() {
return "Animal{name = " + name + ", age = " + age + "}";
}
}
Cat类:
package a05mygenericsdemo;
public abstract class Cat extends Animal{
//继承抽象 类重写里面的所有抽象方法
//2.本身Cat也是一个抽象的,让Cat的子类再重写抽象方法
//此时采取第二种方法
//因为猫的两个子类中的eat的方法体还是不一样的
}
Dog类:
package a05mygenericsdemo;
public abstract class Dog extends Animal {
}
波斯猫类:
package a05mygenericsdemo;
public class PersianCat extends Cat{
@Override
public void eat() {
System.out.println("一只叫做"+getName()+"的,"+getAge()+"岁的波斯猫,正在吃小饼干");
}
}
狸花猫类:
package a05mygenericsdemo;
public class LiHuaCat extends Cat{
@Override
public void eat() {
System.out.println("一只叫做"+getName()+"的,"+getAge()+"岁的狸花猫,正在吃鱼");
}
}
泰迪类:
package a05mygenericsdemo;
public class TeddyDog extends Dog{
@Override
public void eat() {
System.out.println("一只叫做"+getName()+"的,"+getAge()+"岁的泰迪,正在吃骨头,边吃边蹭");
}
}
哈士奇类:
package a05mygenericsdemo;
public class HuskyDog extends Dog{
@Override
public void eat() {
System.out.println("一只叫做"+getName()+"的,"+getAge()+"岁的哈士奇,正在吃骨头,边吃边拆家");
}
}
测试类:
package a05mygenericsdemo;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
}
//需求1:
// public static void keepPet(ArrayList<?extends Cat> list){
//
// }
//需求2:
// public static void keepPet(ArrayList<?extends Dog> list){
//
// }
//需求3:
public static void keepPet(ArrayList<?extends Animal> list){
}
}
本文介绍了Java泛型的使用,特别是通配符在处理不确定类型但有继承关系的场景中的应用。通过实例展示了如何定义和使用泛型类和方法,以及如何满足不同要求的饲养动物方法。

1026

被折叠的 条评论
为什么被折叠?



