Java 泛型上下界(上下限)

UML 类图,A 继承自 Object,B 继承自 A,C 继承自 B
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 对象。


以上内容都是我自己经过测试的个人总结,如有纰漏敬请谅解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,741评论 18 399
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,456评论 0 16
  • 开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List作为形式参数,那么如果尝试...
    时待吾阅读 1,127评论 0 3
  • 2.6 Java泛型详解 Java泛型是JDK5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type...
    jianhuih阅读 757评论 0 3
  • 很久没有这样,中途3点多醒过来,翻身起床,慌乱找寻自己的手机,生怕因为闹钟没有响、或是响了没有听到而错过早晨客户的...
    4点零3阅读 339评论 2 1

友情链接更多精彩内容