泛型的继承 与 通配符

泛型的继承 与 通配符

package com.sq.java2;

public class Person {
}

package com.sq.java2;

public class Student extends Person{
}

package com.sq.java2;

import org.junit.Test;

import java.util.*;

/*
    1.泛型在继承方面的体现

    2.通配符的使用

 */
public class GenericTest {
    /*
        1.泛型在继承方面的体现

        虽然类 A 是类 B 的父类,但是G<A> 和 G<B> 二者不具备父类关系,二者是并列关系

        补充:类 A 是类 B 的父类,A<G> 是 B<G> 的父类
     */
    @Test
    public void test1(){

        Object obj = null;
        String str = null;
        obj = str;

        Object[] arr1 = null;
        String[] arr2 = null;
        arr1 = arr2;

        List<Object> list1 = null;
        List<String> list2 = null;
        // 此时的 list1 和 list2 的类型不具有子父类关系
//        list1 = list2; // 编译不通过
        // 与下面报错相似
//        Date date = new Date();
//        str = date; // 编译不通过

        /*
            反证法:
            假设 list1 = list2;
                list1.add(123); 导致混入非 String 的数据。出错。

         */
        show(list1);
//        show(list2);// 报错
        show1(list2);
    }
    public void show(List<Object> list){

    }
    public void show1(List<String> list){

    }

    @Test
    public void test2(){
        // 实现接口
        List<String> list1 = null;
        // 继承父类
        AbstractList<String> list2 = null;
        ArrayList<String> list3 = null;
        list1 = list2;
        list2 = list3;

        List<String> list4 = new ArrayList<>();
    }

    /*
        2.通配符的使用
            通配符:?

            类 A 是类 B 的父类,G<A> 和G<B> 是没有关系的,二者共同的父类是: G<?>
     */
    @Test
    public void test3(){
        List<Object> list1 = null;
        List<String> list2 = null;

        // List<?> 是 List<Object> 和 List<String> 的父类
        List<?> list = null;

        list = list1;
        list = list2;

        // 编译通过
//        print(list1);
//        print(list2);

        //
        List<String> list3 = new ArrayList<>();
        list3.add("AA");
        list3.add("BB");
        list3.add("CC");
        list = list3;
        System.out.println(list);// [AA, BB, CC]

        // 添加(写入):对于 List<?> 就不能向其内部添加数据。
        // 除了添加 null 之外。
//        list.add("DD");
//        list.add('?');

        list.add(null);
        System.out.println(list);// [AA, BB, CC, null]

        // 获取(读取):允许读取数据,读取的数据类型为 Object。
        Object o = list.get(0);
        System.out.println(o); // AA
    }

    public void print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while(iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
        }
    }

    /*
        3.有限制条件的通配符的使用
            ? extends A:
                G<? extends A> 可以作为 G<A> 和 G<B> 的父类,其中 B 是 A 的子类
            ? super A:
                G<? super A> 可以作为G<A> 和 G<B> 的父类,其中 B 是 A 的父类

     */
    @Test
    public void test4(){

        List<? extends Person> list1 = null;// extends 相当于 <=
        List<? super Person> list2 = null;// super 相当于 >=

        List<Student> list3 = null;
        List<Person> list4 = null;
        List<Object> list5 = null;

        list1 = list3;
        list1 = list4;
//        list1 = list5;

//        list2 = list3;
        list2 = list4;
        list2 = list5;

        // 读取数据:
        list1 = list3;
        Person p = list1.get(0);
        // 编译不通过
        // Student s = list1.get(0);

        list2 = list4;
        Object obj = list2.get(0);
        // 编译不通过
//        Person obj = list2.get(0);

        // 写入数据:
        // 编译不通过
//        list1.add(new Student());

        // 编译通过
        list2.add(new Person());
        list2.add(new Student());
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值