美文网首页Java
Java 泛型上下界(上下限)

Java 泛型上下界(上下限)

作者: 花落红窗 | 来源:发表于2017-04-07 18:55 被阅读0次
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 关键字声明,表示参数化的类型可能是所指定的类或者其任意子类。泛型的上界就是 B 类。

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

下界

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

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


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

相关文章

  • Java 泛型上下界(上下限)

    上界 上界用 extends 关键字声明,表示参数化的类型可能是所指定的类或者其任意子类。泛型的上界就是 B 类。...

  • 泛型的上/下界通配符

    上界不能往里存,只能往外取 比如,我们现在定义:List首先你...

  • Kotlin-泛型

    源自:码上开学-Kotlin的泛型 kotlin的in和out对应的是java中带上界和下界的通配符?号。【in】...

  • 泛型中 ? super T和 ? extends T的区别

    首先, 说到 Java 的泛型, 我们必须要提到的是Java 泛型的类型擦除机制: Java中的泛型基本上都是在编...

  • Kotlin 泛型 VS Java 泛型

    建议先阅读我的上一篇文章 -- Java 泛型 和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言...

  • 泛型机制(二)

    泛型通配符 实例代码 结果 泛型的上下限限定 定义

  • Java泛型通配符,上下界。

    为了理清楚泛型的通配符和上下界的作用,并为了Kotlin的泛型中的关键字in和out的理解,在此用小demo重新梳...

  • java 泛型 上下界通配符

    1. 为什么要用通配符和边界? 2.Plate下边界通配符范围 Plate

  • java中泛型(上)

    本文参考了java核心卷1中泛型程序设计该章节和java编程思想第15章。 泛型即适用于许多许多的类型。泛型最初的...

  • spring 泛型处理

    java 泛型基础 泛型类型:泛型类型是在类型上参数化的泛型类或接口 泛型使用场景编译时前类型检查。定义为 Col...

网友评论

    本文标题:Java 泛型上下界(上下限)

    本文链接:https://www.haomeiwen.com/subject/ibvhattx.html