我正在用 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通配符的集合的经验法则是,您可以从集合中提取值,但不能将值放入. 如果您所做的只是从列表中读取,那么您应该使用通配符。