首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java泛型的类型参数中的问号是什么意思?

Java泛型的类型参数中的问号是什么意思?
EN

Stack Overflow用户
提问于 2010-06-10 04:38:22
回答 2查看 123.2K关注 0票数 247

这是摘自斯坦福解析器附带的一些示例的一小段代码。我已经用Java开发了大约4年,但对于这种风格的代码应该意味着什么,我从来没有非常深刻的理解。

代码语言:javascript
复制
List<? extends HasWord> wordList = toke.tokenize();

我并不担心代码的细节。我困惑的是,在英语中,泛型表达式到底应该表达什么。

有人能给我解释一下吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-10 04:42:50

代码语言:javascript
复制
? extends HasWord

表示“扩展HasWord的类/接口”。换句话说,HasWord本身或它的任何子代...基本上,任何可以与instanceof HasWordnull一起工作的东西。

在更专业的术语中,? 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

这听起来可能令人困惑。但是,您可以在Listsort命令中看到它(这只是Collections.sort的两个参数版本的快捷方式)。它实际上接受的不是Comparator<T>,而是Comparator<? super T>。在这种情况下,比较器使用List的元素来重新排序列表本身。

票数 250
EN

Stack Overflow用户

发布于 2010-06-10 04:43:43

List<? extends HasWord>接受任何扩展HasWord的具体类。如果您有以下类...

代码语言:javascript
复制
public class A extends HasWord { .. }
public class B extends HasWord { .. }
public class C { .. }
public class D extends SomeOtherWord { .. }

..。wordList只能包含As或Bs的列表,或者两者的混合,因为这两个类都扩展了相同的父类或null (这会导致HasWorld的instanceof检查失败)。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3009745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档