java 基础(泛型 通配符)

<?>

允许所有泛型的引用调用

通配符指定上限

上限 extends: 使用时指定的类型必须是继承某个类,或者实现某个接口,即<=

通配符指定下限

下限 super: 使用时指定的类型不能小于操作的类,即 >=

Person.java

package com.klvchen.java2;

public class Person {
}

Student.java

package com.klvchen.java2;

public class Student extends Person{
}

GenericTest.java

package com.klvchen.java2;

import org.junit.Test;

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

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

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

     */

    @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;

        show(list1);
        show1((list2));
    }

    public void show1(List<String> list) {

    }

    public void show(List<Object> list) {

    }

    @Test
    public void test2(){
        AbstractList<String> list1 = null;
        List<String> list2 = null;
        ArrayList<String> list3 = null;

        list1 = list3;
        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 = 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;
        //添加(写入): 对于list<?>就不能向其内部添加数据
        //除了添加 null 以外,
        //list.add("DD");

        list.add(null);

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

    }

    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<? extends A> 可以作为G<A>和G<B>的父类的,其中B是A的父类

     */
    @Test
    public void test4(){
        List<? extends Person> list1 = null;
        List<? super Person> list2 = null;

        List<Student> list3 = new ArrayList<Student>();
        List<Person> list4 = new ArrayList<Person>();
        List<Object> list5 = new ArrayList<Object>();

        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());

    }
}

原文地址:https://www.cnblogs.com/klvchen/p/15413708.html