数组列表 List<interfaceI>
和 List<? extends InterfaceI>
两者都将具有实现 interfaceI 的类的对象。那什么时候用呢?
最佳答案
假设 Foo
和 Bar
是实现 InterfaceI
的两个类.
第二个 ( List<? extends InterfaceI>
) 不允许向列表中添加任何内容(null 除外),因为列表包含的类型是未知的:它可能是 List<Foo>
或 List<Bar>
: 你只是不知道。
因此,当您希望该方法读取作为参数传递的列表的元素,并希望调用者能够使用List<InterfaceI>
, 一个 List<Foo>
或 List<Bar>
.使用 List<InterfaceI>
作为参数只接受 List<InterfaceI>
类型的列表.
让我们举一个具体的例子:你想计算一个数字列表的最大 double 值。这种方法不需要向列表添加或设置任何内容。它所做的只是迭代元素,获取每个数字并计算它们的最大值。签名可以是
public double max(List<Number> list);
但是,你将无法做到
List<Integer> ints = new ArrayList<>();
max(ints);
调用这个方法的唯一方法是做
List<Number> ints = new ArrayList<>();
max(ints);
而如果您将方法声明为
public double max(List<? extends Number> list);
那么你可以做
List<Integer> ints = new ArrayList<>();
List<Long> longs = new ArrayList<>();
max(ints);
max(longs)
关于java - 列表<interfaceI> 与列表<?在 java 中扩展 InterfaceI>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25361705/