【Java】泛型通配符

类型通配符

  1. 类型通配符<?> 一般用于接受使用,不能够做添加
  2. List<?>:表示元素类型未知的list,它的元素可以匹配任何类型
  3. 带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中
  4. 类型通配符上限:<? extend 类型> List <? extends MayiktParent>:它表示的类型是MayiktParent或子类型
  5. 类型通配符下限:<? super 类型> List <? super MayiktParent>:它表示的类型是MayiktParent或者其父类型

示例代码

java 复制代码
package com.collection.Demo06;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test02 {
    public static void main(String[] args) {
        ArrayList<String> arrayListString = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            arrayListString.add("i:" + i);
        }
        ArrayList<Integer> arrayListInteger = new ArrayList<>();
        printList(arrayListString);
        printList(arrayListInteger);

        List<?> arrayList = new ArrayList<>();
//        arrayList.add("fsd");//报错,不能添加
    }
    //参数List类型的泛型,明确String类型
//    public static void printList(List<String> stringList){}


    /**
     * 如果不明确参数List类型的泛型是什么类型,可以使用<?>
     * List<?> 只能用于接收,可以接收所有类型的泛型类型,但不能用于添加
     */
    public static void printList(List<?> stringList) {
//        stringList.add("mayilt");//报错,不能用于添加,∵类型不明确,没法添加
//        Object o = stringList.get(0);//不能添加,但可以get,类型是Object
        Iterator<?> iterator = stringList.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

上限和下限

MayiktParent.java 父类

java 复制代码
package com.collection.Demo06;

public class MayiktParent {
}

Student.java 子类

java 复制代码
package com.collection.Demo06;

public class Student extends MayiktParent{
}

Test03.java 测试

java 复制代码
package com.collection.Demo06;

import java.util.ArrayList;
import java.util.List;

public class Test03 {
    public static void main(String[] args) {
        List<MayiktParent> mayiktParents = new ArrayList<>();
        List<Student> students = new ArrayList<>();
        List<Integer> integers = new ArrayList<>();
        List<Object> objects = new ArrayList<>();
        printList1(mayiktParents);//上限
        printList1(students);//上限
//        printList1(integers);//报错,∵ integer与MayiktParent没有任何关系
//        printList1(objects);//报错,只能是MayiktParent与它的子类

        printList2(mayiktParents); //下限
        printList2(objects);//下限------父类
//        printList2(students);//报错
//        printList2(integers);//报错

        printList3(mayiktParents);
        printList3(students);
        printList3(objects);
//        printList3(integers);//报错

    }

    /**
     * 问题: List<?> 接收所有类型,如何限制?
     * 解决: 类型通配符 上限 和 下限
     * 上限: <? extend 类型> List <? extends MayiktParent>:它表示的类型是MayiktParent或子类型
     * 下限: <? super 类型> List <? super MayiktParent>:它表示的类型是MayiktParent或者其父类型
     */
    //List<? extends MayiktParent>     只能接收MayiktParent 和它的子类
    public static void printList1(List<? extends MayiktParent> list) { //上限
    }

    //List<? super MayiktParent>       只能接收MayiktParent 和它的父类
    public static void printList2(List<? super MayiktParent> list) { //下限
    }

    //如果想是使用super让可以接收mayiktParents和students
    public static void printList3(List<? super Student> list) { //下限
    }
}

下一篇文章:可变参数

相关推荐
码兄科技1 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研2 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe182 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
Drone_xjw3 小时前
从 GDB 到 CDB:C/C++ 程序调试的两把“手术刀”
c语言·开发语言·c++
r_oo_ki_e_3 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff3 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯4 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地4 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我123454 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
2zcode5 小时前
基于MATLAB图像处理的饮料瓶灌装液位检测系统设计与实现
开发语言·图像处理·matlab