Java泛型的通配符和综合练习

本文介绍了Java泛型的使用,特别是通配符在处理不确定类型但有继承关系的场景中的应用。通过实例展示了如何定义和使用泛型类和方法,以及如何满足不同要求的饲养动物方法。
摘要由CSDN通过智能技术生成

一、通配符:

泛型不具备继承性,数据具备继承性

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){

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值