Java™ 教程(泛型通配符使用指南)

泛型通配符使用指南

学习使用泛型编程时更困惑的一个方面是肯定什么时候使用上界通配符以及什么时候使用下界通配符,此页面提供了设计代码时要遵循的一些准则。程序员

对于本文的讨论,将变量看做提供的两个功能之一是有帮助的:编程

  • 一个“In”变量

“in”变量向代码提供数据,想象一下带有两个参数的复制方法:copy(src, dest)src参数提供要复制的数据,所以它是“in”参数。segmentfault

  • 一个“Out”变量

“out”变量保存数据以供其余地方使用,在复制示例中,copy(src, dest)dest参数接受数据,所以它是“out”参数。学习

固然,一些变量既用于“in”又用于“out”目的 — 该场景也在指南中解决。this

在决定是否使用通配符以及适合使用哪一种类型的通配符时,能够使用“in”和“out”原则,如下列表提供了遵循的准则:设计

  • 使用extends关键字定义带有上界通配符的“in”变量。
  • 使用super关键字定义带有下界通配符的“out”变量。
  • 在能够使用Object类中定义的方法访问“in”变量的状况下,使用无界通配符。
  • 在代码须要做为“in”和“out”变量访问变量的状况下,不要使用通配符。

这些指南不适用于方法的返回类型,应该避免使用通配符做为返回类型,由于它强制程序员使用代码来处理通配符。code

List<? extends ...>定义的列表能够非正式地认为是只读的,但这不是一个严格的保证,假设你有如下两个类:rem

class NaturalNumber {

    private int i;

    public NaturalNumber(int i) { this.i = i; }
    // ...
}

class EvenNumber extends NaturalNumber {

    public EvenNumber(int i) { super(i); }
    // ...
}

考虑如下代码:get

List<EvenNumber> le = new ArrayList<>();
List<? extends NaturalNumber> ln = le;
ln.add(new NaturalNumber(35));  // compile-time error

由于List<EvenNumber>List<? extends NaturalNumber>的子类型,你能够将le赋给ln,可是你不能使用ln将天然数添加到偶数列表中,如下列表中的操做是可能的:class

  • 你能够添加null
  • 你能够调用clear
  • 你能够获取迭代器并调用remove
  • 你能够捕获通配符并写入从列表中读取的元素。

你能够看到List<? extends NaturalNumber>定义的列表在严格意义上不是只读的,但你可能会这样想,由于你没法存储新元素或更改列表中的现有元素。


上一篇:泛型通配符捕获和Helper方法

下一篇:类型擦除

相关文章
相关标签/搜索