关于泛型上下限的问题

/*
对于泛型的通配符问号,有两种特殊写法:上下限,上下界。
<?>:随便,谁都行。
<? extends 类>:可以是指定的类,或者其子类。(上限,最高不能超过这个类。)
<? super 类>:可以是指定的类,或者其父类。(下限,最低不能超过这个类。)
API Caller --> Developer
 */
public class Demo02GenericLimit {
    public static void main(String[] args) {
        ArrayList<Animal> animalList = new ArrayList<>();
        ArrayList<Dog> dogList = new ArrayList<>();
        ArrayList<Cat> catList = new ArrayList<>();
        ArrayList<String> strList = new ArrayList<>();
        methodExtends(animalList); // OK
        methodExtends(dogList); // OK
        methodExtends(catList); // OK
//        methodExtends(strList); // 错误!
        System.out.println("==============");
        methodSuper(dogList); // OK
        methodSuper(animalList); // OK
//        methodSuper(catList); // 错误!
//        methodSuper(strList); // 更错!
    }
    // 这个泛型只能匹配Animal或者是Animal的子类
    private static void methodExtends(ArrayList<? extends Animal> list) {
    }
    // 这个泛型只能匹配Dog或者是Dog的父类
    private static void methodSuper(ArrayList<? super Dog> list) {
    }
}
/*
泛型通配符的上下限决定了一个只能放入,一个只能取出。
六个设计原则:
单一职责原则
迪米特法则
接口隔离原则
依赖倒置原则
开闭原则
里氏替换原则:前置条件放大,后置条件缩小。
 */
public class Ext02Generic {
    public static void main(String[] args) {
        List<Animal> animalList = new ArrayList<>();
        List<Dog> dogList = new ArrayList<>();
        List<Cat> catList = new ArrayList<>();
        List<String> strList = new ArrayList<>();
        methodExtends(animalList); // ok
        methodExtends(dogList); // ok
        methodExtends(catList); // ok
        methodSuper(dogList); // ok
        methodSuper(animalList); // ok
//        methodSuper(catList); // wrong!
    }
    private static void methodExtends(List<? extends Animal> list) {
        Animal animal = list.get(0);
//        list.add(new Animal()); 都是错误写法
//        list.add(new Dog());
//        list.add(new Cat());
//        list.add(new Object());
        list.add(null);
    }
    private static void methodSuper(List<? super Dog> list) {
        list.add(new Dog());
        list.add(new Dog2Ha());
//        list.add(new Animal()); // wrong
//        Dog dog = list.get(0); // wrong
//        Animal animal = list.get(0); // wrong
        Object obj = list.get(0);
    }
}

发表评论