1

我正在用 Java 编写一个方法,该方法必须接收并遍历List. 有什么区别:Serializable

public void myMethod(List<Serializable> list) {

}

public void myMethod(List<? extends Serializable> list) {

}


4

3 回答 3

9

在第一种情况下,给方法的列表必须List<Serializable>. 在第二种情况下,它可以是,或List<AnythingThatDerivesFromSerializable>。(在 的具体情况下Serializable,差别不大。)

让我们做一般情况:

class Base {
}

class Sub extends Base {
}

接着

public void myMethod(List<Base> list) {
}

如果我有一个List<Sub>,我不能给它myMethod。但如果你这样做:

public void myMethod(List<? extends Base> list) {
}

我可以。

于 2013-11-04T17:19:46.210 回答
5

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

List<? extends Serializable> list意味着您可以发送一个List<Whatever>只要Whatever实现Serializable接口,例如List<String>.

于 2013-11-04T17:20:03.113 回答
1

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

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

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

于 2013-11-04T17:21:43.070 回答