java 上界和下界,Java 泛型上下界(上下限)

0e3d49da0775

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 对象。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值