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

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源码中出现的知识

链接:复杂泛型源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

l8947943

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值