我正在用Java编写一个必须接收并迭代List
Serializable
的方法。
有什么区别:
public void myMethod(List<Serializable> list) {
}
和
public void myMethod(List<? extends Serializable> list) {
}
答案 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 ,但不能将值放入。如果你所做的只是从列表中读取,那么你应该使用通配符。