泛型继承和通配符

SOBER大约 1 分钟

泛型继承和通配符

说明

  1. 泛型不具备继承性

    List<Object>list = new ArrayList<String>(); // 对吗? 错!

  2. <?>:支持任意泛型类型
  3. <?extends A>:支持 A 类以及 A 类的子类,规定了泛型的上限
  4. <?super A>:支持 A 类以及 A 类的父类,不限于直接父类,规定了泛型的下限

案例

package commonGenericity;

import com.hspedu.poly.detail_.AA;

import java.util.ArrayList;
import java.util.List;
import java.util.function.IntToDoubleFunction;

public class customGenerics {
    public static void main(String[] args) {

        List<Object> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<CC> list3 = new ArrayList<>();
        List<DD> list4 = new ArrayList<>();
        List<EE> list5 = new ArrayList<>();

        // 如果是 List<?>c ,可以接受任意的泛型类型
        printCollection1(list1);
        printCollection1(list2);
        printCollection1(list3);
        printCollection1(list4);
        printCollection1(list5);

        // List<? extends CC> c:可以接受 CC 或者 CC 子类
        // printCollection2(list1); // 错
        // printCollection2(list2); // 错
        printCollection2(list3); // 对
        printCollection2(list4); // 对
        printCollection2(list5); // 对

        // List<? super CC> c: 支持 CC 类以及 CC 类的父类,不限于直接父类:
         printCollection3(list1); // 对
        // printCollection3(list2); // 错
        printCollection3(list3); // 对
        // printCollection3(list4); // 错
        // printCollection3(list5); // 错
    }

    /**
     * 泛型继承和通配符
     * List<?> 表示 任意的泛型类型都可以接受
     */
    public static void printCollection1(List<?> c) {
        for(Object object : c){ // 通配符,取出时,就是 Object
            System.out.println("printCollection1 方法");
            System.out.println(object);
        }
    }

    // ? extends CC 表示 上限,可以接受 CC 或者 CC 子类
    public static void printCollection2(List<? extends CC> c) {
        for (Object object : c) {
            System.out.println("printCollection2 方法");
            System.out.println(object);
        }
    }

    // ? super 子类类名 CC: 支持 CC 类以及 CC 类的父类,不限于直接父类:
    // 规定了泛型的下限
    public static void printCollection3(List<? super CC> c){
        for(Object object : c) {
            System.out.println(object);
        }
    }
}

class CC {}

class DD extends CC {}

class EE extends DD {}