对java通配符的理解

<? extends T>
    extends关键字是上限,?类型是E或者E的子类型
    可以读取E,但不能写入,因为不知道声明对象是符合未知的E的子类型

<? super T> 

package com.lyl.jni.kt;


import java.util.ArrayList;

/**
 * Create By: lyl
 * Date: 2020/5/9 2:49 PM
 */
public class genericityTest {

    public static void main(String[] args) {

    }

    public void test1() {
        //上限
        ArrayList<? extends Object> list = new ArrayList<>();
        //不能加
        // why  ?extends Object 表示?继承至Object,?是子类,Object是父类     表明 list 里面的数据是 Object 和 Object 的子类
        // 当要向 list 添加一个数据时,list(java vm) 不知道要添加数据的类型是 Object 还是 Object 的子类,不知道是不是符合未知的Object的子类型,所以拒绝添加
        // 从 list 里面的到一个数据,list 的数据类型是 Object 和 Object 的子类,所以可以将取出的数据向上转型成 Object 类型
//        list.add("aa");
        Object o = list.get(0);
    }

//    List<? extends E>	 a
//    extends关键字是上限,?类型是E或者E的子类型
//    可以读取E,但不能写入,因为不知道声明对象是符合未知的E的子类型

    public void test2() {
        ArrayList<? super Object> list = new ArrayList<>();

        list.add("aa");
//        Object o = null;
//        list.add(o);
        Object s = list.get(0);
    }

    public void test3() {
        //上限
        ArrayList<? extends H3> list = new ArrayList<>();
        //不能加
        // why  ?extends Object 表示?继承至Object,?是子类,Object是父类     表明 list 里面的数据是 Object 和 Object 的子类
        // 当要向 list 添加一个数据时,list(java vm) 不知道要添加数据的类型是 Object 还是 Object 的子类,不知道是不是符合未知的Object的子类型,所以拒绝添加
        // 从 list 里面的到一个数据,list 的数据类型是 Object 和 Object 的子类,所以可以将取出的数据向上转型成 Object 类型

        H1 h1 = new H1() {
        };
        H2 h2 = new H2();
        H3 h3 = new H3();
        H4 h4 = new H4();
        H5 h5 = new H5();

//        list.add(h1);
//        list.add(h2);
//        list.add(h3);
//        list.add(h4);
//        list.add(h5);

        H3 h31 = list.get(0);

        //------------------------------------------------------------------------------------------
        ArrayList<? extends H2> listP = new ArrayList<>();
        ArrayList<? extends H4> listC = new ArrayList<>();
        //out
        // list is H3
        // listP request H2 , H3 extends H2 , H3 可以向上转型成 H2 ?,可以转型吗 java 里面可以,(里氏替换)
        // listC 需要H4 ,H4 extends H3, H3 需要向下转型成 H4 ?,行吗 需要强转 一般不行
        listP = list;
        listC = (ArrayList<? extends H4>) list;
//        listC = list;
    }

    public void test4() {
        //下限
        ArrayList<? super H3> list = new ArrayList<>();
        //不能加 H1 H2
        //可以加 H4 H5
        // why  ?extends Object 表示?继承至Object,?是子类,Object是父类     表明 list 里面的数据是 Object 和 Object 的子类
        // 当要向 list 添加一个数据时,list(java vm) 不知道要添加数据的类型是 Object 还是 Object 的子类,不知道是不是符合未知的Object的子类型,所以拒绝添加
        // 从 list 里面的到一个数据,list 的数据类型是 Object 和 Object 的子类,所以可以将取出的数据向上转型成 Object 类型

        H1 h1 = new H1() {
        };
        H2 h2 = new H2();
        H3 h3 = new H3();
        H4 h4 = new H4();
        H5 h5 = new H5();

//        list.add(h1);
//        list.add(h2);
        list.add(h3);
        list.add(h4);
        list.add(h5);

        Object object = list.get(0);


        //------------------------------------------------------------------------------------------
        ArrayList<? super H2> listP = new ArrayList<>();
        ArrayList<? super H4> listC = new ArrayList<>();
        //out
        // list is H3
        // listP request H2及父类 , H3 extends H2 , H3 可以向上转型成 H2 ?,可以转型吗 java 里面可以,(里氏替换)
        // listC 需要H4及父类 ,H4 extends H3, H3 是 H4 的父类
//        listP = list;
        listP = (ArrayList<? super H2>) list;
        listP = (ArrayList<? super H1>) list;
        listP = (ArrayList<? super Object>) list;
        listC = list;
    }

    abstract class H1 {
    }

    class H2 extends H1 {
    }

    class H3 extends H2 {
    }

    class H4 extends H3 {
    }

    class H5 extends H4 {
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值