首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List<Serializable>对List<?扩展Serializable>

List<Serializable>对List<?扩展Serializable>
EN

Stack Overflow用户
提问于 2013-11-04 17:17:55
回答 3查看 1.5K关注 0票数 1

我正在用Java编写一个必须在List of Serializable上接收和迭代的方法。

在以下方面有什么区别:

代码语言:javascript
复制
public void myMethod(List<Serializable> list) {

}

代码语言:javascript
复制
public void myMethod(List<? extends Serializable> list) {

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-04 17:19:46

在第一种情况下,提供给方法的列表必须是List<Serializable>。在第二种情况下,它可以是,或List<AnythingThatDerivesFromSerializable>。(在Serializable的具体情况下,这不太可能有多大的区别。)

让我们做一个一般的例子:

代码语言:javascript
复制
class Base {
}

class Sub extends Base {
}

然后

代码语言:javascript
复制
public void myMethod(List<Base> list) {
}

如果我有一个List<Sub>,我就不能把它给myMethod。但如果你这么做了

代码语言:javascript
复制
public void myMethod(List<? extends Base> list) {
}

我可以的。

票数 9
EN

Stack Overflow用户

发布于 2013-11-04 17:20:03

List<Serializable> list意味着您只能发送List<Serializable>参数或实现List<Serializable> (如ArrayList<Serializable> )的类。

List<? extends Serializable> list意味着只要Whatever实现Serializable接口(例如List<String> ),就可以发送Serializable

票数 5
EN

Stack Overflow用户

发布于 2013-11-04 17:21:43

List<? extends Serializable>将允许调用方传递Serializable的任何子类型的列表。这通常比要求精确的类型匹配更灵活。

但是,请注意,在List<E>上使用扩展通配符将限制您可以执行的操作。具体来说,您将无法调用任何具有包含有界泛型参数的参数类型的实例方法。例如,您不能调用list.add(E),因为它有一个参数类型E (您可以使用通配符进行绑定),但是您可以调用get(int)

对于具有扩展通配符的集合,经验法则是可以从集合中提取值,但不能将值放入其中。如果您所做的只是从列表中读取,那么您应该使用通配符。

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

https://stackoverflow.com/questions/19773255

复制
相关文章

相似问题

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