使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。
day057 泛型类型的继承规则、通配符类型(通配符概念、通配符的超类限定、无限定通配符、通配符捕获)
目录
day057 泛型类型的继承规则、通配符类型(通配符概念、通配符的超类限定、无限定通配符、通配符捕获)
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.通配符概念
通配符类型中,允许类型参数变化。例如,通配符类型