这是摘自斯坦福解析器附带的一些示例的一小段代码。我已经用Java开发了大约4年,但对于这种风格的代码应该意味着什么,我从来没有非常深刻的理解。
List<? extends HasWord> wordList = toke.tokenize();
我并不担心代码的细节。我困惑的是,在英语中,泛型表达式到底应该表达什么。
有人能给我解释一下吗?
发布于 2010-06-10 04:42:50
? extends HasWord
表示“扩展HasWord
的类/接口”。换句话说,HasWord
本身或它的任何子代...基本上,任何可以与instanceof HasWord
和null
一起工作的东西。
在更专业的术语中,? extends HasWord
是一个有界通配符,从第139页开始,在Effective Java 3rd Edition的第31项中进行了介绍。与第二版相同的章节是available online as a PDF;关于有界通配符的部分是从第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
的元素来重新排序列表本身。
发布于 2010-06-10 04:43:43
List<? extends HasWord>
接受任何扩展HasWord的具体类。如果您有以下类...
public class A extends HasWord { .. }
public class B extends HasWord { .. }
public class C { .. }
public class D extends SomeOtherWord { .. }
..。wordList
只能包含As或Bs的列表,或者两者的混合,因为这两个类都扩展了相同的父类或null
(这会导致HasWorld
的instanceof检查失败)。
https://stackoverflow.com/questions/3009745
复制相似问题