数据结构系列18——泛型进阶(通配符以及通配符的上界与下界)

        之前总结过了泛型的基础知识,现在对泛型的通配符以及通配符的上界以及下界进行总结

链接:数据结构系列2——泛型_哈士奇的奥利奥的博客-CSDN博客

目录

1.通配符

2.通配符的上界

3.通配符的下界


1.通配符

package generic;

/**
 * Created with IntelliJ IDEA.
 * Description:泛型的进阶——通配符
 * User: YAO
 * Date: 2023-04-10
 * Time: 18:39
 */
class Message {
    private T message ;
    public T getMessage() {
        return message;
    }
    public void setMessage(T message) {
        this.message = message;
    }
}
public class test1 {
    public static void main(String[] args) {
        Message message1 = new Message<>();
        message1.setMessage("hello");
        //通过调用方法进行获取
        fun(message1);

        //如果创建了一个Integer的泛型对象
        Message message2 = new Message<>();
        message2.setMessage(11);
        //这样就无法使用fun方法
//        fun(message2);
        //引入通配符?之后再进行代用函数,尽可以进行使用
        fun2(message1);
        fun2(message2);
    }
    public static void fun(Message temp){
        System.out.println(temp.getMessage());
    }
    public static void fun2(Message temp){
        System.out.println(temp.getMessage());
    }

}

2.通配符的上界

数据结构系列18——泛型进阶(通配符以及通配符的上界与下界)_第1张图片

 通配符的上界,不能进行写入数据,只能进行读取数据。

public class test2 {
    /**
     * 1.测试泛型的上界
     */
    public static void main1(String[] args) {
        //1.实例化一个盘子对象
        Plate applePlate = new Plate<>();
        //2.调用盘子类中的方法
        applePlate.setMessage(new Apple());
        Plate bananaPlate = new Plate<>();
        bananaPlate.setMessage(new Banana());
        //3.进行获取盘子的信息
        func1(applePlate);
        func1(bananaPlate);

    }
    public static void func1(Plate tmp){
        //tmp:传入的参数为Fruit的子类或者本身
        Apple apple = new Apple();
        //1.此时的tmp传入的不一定是apple,所以不能将传入,传入的只能是确定是tmp子类,但是这个子类不确定,因为tmp不确定。
        //tmp.setMessage(apple);
        //tmp.setMessage(new Apple());

        //2.但是可以进行接收,因为tmp的上界已经确定,只需要拿上界进行接收就可以,此时有可能发生向上转型
        Fruit fruit = tmp.getMessage();
        System.out.println(fruit);
    }
}

3.通配符的下界

数据结构系列18——泛型进阶(通配符以及通配符的上界与下界)_第2张图片

 通配符的下界,不能进行读取数据,只能写入数据。

public class test2 {

    /**
     * 2.测试泛型的下界
     */
    public static void main(String[] args) {
        //1.实例化一个盘子对象
        Plate fruitPlate = new Plate<>();
        //2.调用盘子类中的方法
        fruitPlate.setMessage(new Apple());
        Plate foodPlate = new Plate<>();
        foodPlate.setMessage(new Banana());
        //3.通过泛型进行获取盘子的信息
        func2(fruitPlate);
        func2(foodPlate);
    }
    public static void func2(Plate tmp){
        // tmp:传入是Fruit的父类或者本身

        // 1.此时调用set方法是传入的参数可以确定为tmp的子类,因为tmp的下界已经确定,此时传入下界的子类即可
        Apple apple = new Apple();
        tmp.setMessage(apple);

        tmp.setMessage(new Apple());
        tmp.setMessage(new Banana());

        // 2.但是不可以接收,因为不确定是哪个父类或者是不是自己本身,只能直接输出。
        // Fruit fruit = tmp.getMessage();
        System.out.println(tmp.getMessage());
    }
}

你可能感兴趣的:(数据结构,数据结构,java,开发语言)