Java学习day057 泛型类型的继承规则、通配符类型(通配符概念、通配符的超类限定、无限定通配符、通配符捕获)

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。

day057   泛型类型的继承规则、通配符类型(通配符概念、通配符的超类限定、无限定通配符、通配符捕获)

目录

day057   泛型类型的继承规则、通配符类型(通配符概念、通配符的超类限定、无限定通配符、通配符捕获)

1.泛型类型的继承规则

2.通配符概念

3.通配符的超类型限定

4.无限定通配符

5.通配符捕获


1.泛型类型的继承规则

在使用泛型类时,需要了解一些有关继承和子类型的准则。下面先从许多程序员感觉不太直观的情况开始。考虑一个类和一个子类,如 Employee 和 Manager。Pair<Manager>是PaiKEmployee>的一个子类吗? 答案是“不是”,或许人们会感到奇怪。例如,下面的代码将不能编译成功:

ManagerD topHonchos=. .
Pair<Employee> result=ArrayAlg.ininmax(topHonchos);//Error

minmax 方法返回 Pair<Manager>,而不是 Pair<Employee>,并且这样的赋值是不合法的。无论S 与 T 有什么联系(如图  所示),通常,PaiKS>与 Pair<T>S有什么联系。这一限制看起来过于严格,但对于类型安全非常必要。假设允许将 Pair<Manager>转换为 Pair<Employee>。考虑下面代码:

Pai r<Manager> managerBuddies = new Pairo(ceo, cfo);
Pair<Employee> employeeBuddies = managerBuddies; // illegal, but suppose it wasn't
employeeBuddies.setFirst(1owlyEmployee);

                                      

然而,最后一句是合法的。但是 employeeBuddies和 managerBuddies引用了同样的对象。现在将 CFO和 一 个 普 通 员 工 组 成 一 对,这 对 于 Pair<Manager>说 应 该 是 不 可 能 的。

永远可以将参数化类型转换为一个原始类型。例如,PaiKEmployee>是原始类型Pair的一个子类型。在与遗留代码衔接时,这个转换非常必要。转换成原始类型之后会产生类型错误吗?很遗憾,会!看一看下面这个示例:

Pair<Manager> managerBuddies = new Pairo(ceo, cfo);
Pair rawBuddies = managerBuddies; //OK
rawBuddies.setFirst(new File(". . .")); //only a compile-time warning

听起来有点吓人。但是,请记住现在的状况不会再比旧版 Java的情况糟糕。虚拟机的安全性还没有到生死攸关的程度。当使用 getFirst获得外来对象并赋给 Manager 变量时,与通常一样,会抛出 ClassCastException异常。这里失去的只是泛型程序设计提供的附加安全性。

最后,泛型类可以扩展或实现其他的泛型类。就这一点而言,与普通的类没有什么区别。例如,ArrayList<T>类实现 List<T>接口。这意味着,一个 ArrayList<Manager>可以被转换为一个 List<Manager>。但是,如前面所见,一个 ArrayList<Manager>不是一个ArrayList<Employee> 或 List<Employee>。下图展示了它们之间的联系。                 

                       


2.通配符概念

通配符类型中,允许类型参数变化。例如,通配符类型

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值