java泛型通配符&lt? extends T&gt和&lt? super T&gt的理解

无人久伴 提交于 2020-02-04 07:07:10

1. 什么是泛型通配?

当使用泛型类或者泛型接口时候,传递数据过程中,泛型类型不确定, 则可以通过<?> 来匹配。一旦使用通配符,只能使用Object中共性方法。

2. 使用通配符<?>示例

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);

        ArrayList<String> list2 = new ArrayList<>();
        list2.add("a");
        list2.add("b");

        // 调用输出函数,分别想打印结果
        printArray(list1);
        printArray(list2);
    }

    /*
        当传入Integer类型,list2将会报错,当传入String类型,list1将会报错
        此时,很多会填入Object泛型,但是对不起,泛型没有继承概念
        因此我们使用通配符?
     */
    public static void printArray(ArrayList<?> list) {
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()) {
            // 注意返回Object对象类型
            Object next = iterator.next();
            System.out.println(next);
        }
    }
}

输出结果:
在这里插入图片描述

3. 使用受限泛型

/*
    泛型的上限限定:? extends E 代表使用的泛型只能是E类型的子类/本身
    泛型的下限限定:? super E   代表使用的泛型只能是E类型的父类/本身
 */
public class GenericDemo {
    public static void main(String[] args) {
        Collection<Integer> list1 = new ArrayList<>();
        Collection<String> list2 = new ArrayList<>();
        Collection<Number> list3 = new ArrayList<>();
        Collection<Object> list4 = new ArrayList<>();

        /*
           类与类之间的继承关系
           Integer extends Number extends Object
           String extends Object
         */
        getElement1(list1);
        getElement1(list2); // 报错,因为getElement1只接受Number本身及其子类
        getElement1(list3);
        getElement1(list4); // 报错,因为getElement1只接受Number本身及其子类

        getElement2(list1); // 报错,因为getElement2只接受Number本身及其父类
        getElement2(list2); // 报错,因为getElement2只接受Number本身及其父类
        getElement2(list3);
        getElement2(list4);
    }

    // 泛型上限,只接受Number及其子类
    public static void getElement1(Collection<? extends Number> coll) {
    }

    // 泛型下限,只接受Number及其父类
    public static void getElement2(Collection<? super Number> coll) {
    }

}

4. 再深入研究java源码中出现的知识

链接:复杂泛型源码

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!