乐趣区

关于java:Java-泛型上下界上下限

public class Test_2 {public static void main(String[] args) {List<? extends B> list1 = new ArrayList<>();  // 上界
        List<? super B> list2 = new ArrayList<>();    // 下界
        A a = new A();
        B b = new B();
        C c = new C();
        Object o = new Object();
        // list1.add(o); 不能增加任何元素,因为 List 中具体是 B 的哪种子类无奈确定
        // list1.add(a);
        // list1.add(b);
        // list1.add(c);
        o = list1.get(0);
        a = list1.get(0);
        b = list1.get(0);
        // c = list1.get(0); 编译谬误,编译器无奈向下转型
        // list2.add(o); 编译谬误,// list2.add(a); 因为 List 中具体是 B 的哪种父类无奈确定
        list2.add(b);
        list2.add(c);
        o = list2.get(0);
        // a = list2.get(0); 编译谬误,因为 List 中具体是 B 的哪种父类无奈确定,无奈向下转型,而 Object 是所有类的父类
        // b = list2.get(0);
        // c = list2.get(0);
    }
}

class A {}

class B extends A {}

class C extends B {}

上界

上界用 extends 关键字申明,示意参数化的类型可能是所指定的类或者其任意子类。例如 <? extends B>,泛型的上界就是 B 类。

形如 List<? extends B>,具体哪一种不能确定,既能够是 B,也能够是 C。在尝试执行 add() 办法时,List 中的类型不能确定是具体哪一种,所以会编译报错。在执行 get() 办法时,不论是 B 还是 C,都能够以 A 类对象来接管。所以 List<? extends B> 不能增加元素,具备只读属性,只能获取。

下界

下界用 super 关键字申明,示意参数化的类型可能是所指定的类型或者其任意父类。例如 <? super B>,泛型的下界就是 B 类。

形如 List<? super B>,具体哪一种不能确定,既能够是 B,也能够是 A,直至 Object 类。在尝试执行 add() 办法时,尽管 List 的具体类型不能确定,然而依据多态,B 类及其子类的对象必定都能够被赋值给 B 的对象,所以只能增加 B 类及其子类的对象。在尝试执行 get() 办法时,List 中的类型是 B 类或者其父类的具体一种,向上直至 Object 类,所以只能将获取的元素赋值给 Object 对象。


以上内容都是我本人通过测试的集体总结,如有纰漏敬请体谅。

退出移动版