? extends HasWord
表示“扩展的类/接口H
asWord”。换句话说,
HasWord它本身或其任何子代…基本上可以与
instanceof HasWordplus一起使用的任何东西null。
用更专业的术语来说,
? extends HasWord是有界通配符,在第139页的有效Java 3rd Edition的项目31中进行了介绍。有界通配符的部分是从第134页开始的第28项。
更新:由于Oracle不久前将其删除,因此PDF链接已更新。现在,它指向由伦敦玛丽皇后大学电子工程与计算机科学学院托管的副本。
更新2:让我们更详细地说明为什么要使用通配符。
如果声明一个方法的签名希望你传入
List<HasWord>,那么唯一可以传入的是
List<HasWord>。
但是,如果所说的签名是,
List<? extends HasWord>那么你可以
List<ChildOfHasWord>改为输入。
请注意,
List<? extends HasWord>和之间有细微的差别
List<? super HasWord>。正如
Joshua Bloch所说:
PECS =生产者扩展,消费者超级。
这意味着,如果传入的是你的方法从中提取数据的集合(即,该集合正在生成供你的方法使用的元素),则应使用extends。如果你传入的是方法要向其中添加数据的集合(即该集合正在消耗你的方法创建的元素),则应使用super。
这听起来可能令人困惑。但是,你可以在
List的
sort命令中看到它(这只是
Collections.sort的两个参数版本的快捷方式)。而不是取一个
Comparator<T>,实际上需要一个
Comparator<? super T>。在这种情况下,比较器将使用的元素,
List以便对列表本身进行重新排序。



