我正在用Java编写一个必须在List of Serializable上接收和迭代的方法。
在以下方面有什么区别:
public void myMethod(List<Serializable> list) {
}和
public void myMethod(List<? extends Serializable> list) {
}发布于 2013-11-04 17:19:46
在第一种情况下,提供给方法的列表必须是是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-04 17:20:03
List<Serializable> list意味着您只能发送List<Serializable>参数或实现List<Serializable> (如ArrayList<Serializable> )的类。
List<? extends Serializable> list意味着只要Whatever实现Serializable接口(例如List<String> ),就可以发送Serializable。
发布于 2013-11-04 17:21:43
List<? extends Serializable>将允许调用方传递Serializable的任何子类型的列表。这通常比要求精确的类型匹配更灵活。
但是,请注意,在List<E>上使用扩展通配符将限制您可以执行的操作。具体来说,您将无法调用任何具有包含有界泛型参数的参数类型的实例方法。例如,您不能调用list.add(E),因为它有一个参数类型E (您可以使用通配符进行绑定),但是您可以调用get(int)。
对于具有扩展通配符的集合,经验法则是可以从集合中提取值,但不能将值放入其中。如果您所做的只是从列表中读取,那么您应该使用通配符。
https://stackoverflow.com/questions/19773255
复制相似问题