我正在用 Java 编写一个方法,该方法必须接收并遍历List
.
有什么区别:Serializable
public void myMethod(List<Serializable> list) {
}
和
public void myMethod(List<? extends Serializable> list) {
}
我正在用 Java 编写一个方法,该方法必须接收并遍历List
.
有什么区别:Serializable
public void myMethod(List<Serializable> list) {
}
和
public void myMethod(List<? extends Serializable> list) {
}
在第一种情况下,给方法的列表必须是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) {
}
我可以。
List<Serializable> list
意味着您只能发送List<Serializable>
参数或实现List<Serializable>
like的类ArrayList<Serializable>
。
List<? extends Serializable> list
意味着您可以发送一个List<Whatever>
只要Whatever
实现Serializable
接口,例如List<String>
.
List<? extends Serializable>
将允许调用者传入任何子类型的列表Serializable
。这通常比要求精确类型匹配更灵活。
但是请注意,使用扩展通配符 onList<E>
将限制您可以执行的操作。具体来说,您将无法调用具有包含有界泛型参数的参数类型的任何实例方法。例如,你不能调用list.add(E)
,因为它有一个参数类型E
(你用通配符限定),但你可以调用get(int)
.
带有extends通配符的集合的经验法则是,您可以从集合中提取值,但不能将值放入. 如果您所做的只是从列表中读取,那么您应该使用通配符。