列出<serializable> vs List <! - ?扩展Serializable - > </serializable>

时间:2013-11-04 17:17:55

标签: java

我正在用Java编写一个必须接收并迭代List Serializable的方法。
有什么区别:

public void myMethod(List<Serializable> list) {

}

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

}


3 个答案:

答案 0 :(得分: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) {
}

我可以。

答案 1 :(得分:5)

List<Serializable> list表示您只能发送List<Serializable>参数或实现List<Serializable>的{​​{1}}类。

ArrayList<Serializable>表示只要List<? extends Serializable> list实施List<Whatever>界面,您就可以发送Whatever,例如Serializable

答案 2 :(得分:0)

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

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

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