此Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言变化以获取Java SE 9及后续版本中更新的语言特性的概述。
请参阅JDK发行说明以了解有关所有JDK版本的新功能、增强功能和已移除或弃用选项的信息。
在学习使用泛型编程时,更令人困惑的是确定何时使用上界通配符和何时使用下界通配符。本页面提供了一些设计代码时应遵循的指南。
在本讨论中,将变量视为提供两种功能之一是有帮助的:
当然,有些变量既用于“输入”又用于“输出” —— 这种情况也在指南中考虑到了。
在决定是否使用通配符以及何种类型的通配符时,可以使用“输入”和“输出”的原则。以下列表提供了遵循的指南:
这些指南不适用于方法的返回类型。应避免使用通配符作为返回类型,因为这会强制使用代码的程序员处理通配符。
由List<? extends ...>定义的列表可以非正式地视为只读,但这不是严格的保证。假设有以下两个类:
class NaturalNumber { private int i; public NaturalNumber(int i) { this.i = i; } // ... } class EvenNumber extends NaturalNumber { public EvenNumber(int i) { super(i); } // ... }
考虑以下代码:
List<EvenNumber> le = new ArrayList<>(); List<? extends NaturalNumber> ln = le; ln.add(new NaturalNumber(35)); // 编译时错误
因为List<EvenNumber>是List<? extends NaturalNumber>的子类型,可以将le赋给ln。但是,不能使用ln向只包含偶数的列表中添加一个自然数。以下对列表的操作是可能的:
可以看出,由List<? extends NaturalNumber>定义的列表在严格意义上并不是只读的,但是你可以这样认为,因为你无法在列表中存储新元素或更改现有元素。