java - 列表<interfaceI> 与列表<?在 java 中扩展 InterfaceI>

标签 java generics collections arraylist

数组列表 List<interfaceI>List<? extends InterfaceI>两者都将具有实现 interfaceI 的类的对象。那什么时候用呢?

最佳答案

假设 FooBar是实现 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/

相关文章:

java - 使用输入处理器使对象遵循触摸输入的 x 轴,对象会变得疯狂

java - 数组怪癖中的最小数字

c# - 具有一个泛型类型参数的 Tuple 有什么用?

c# - 可以将两个重载方法变成单个方法

java - Java 中的 ArrayList 内的 Arraylist 内的 Arraylist

c# - 处理集合时正确使用属性

java - 项目在 Android Studio 模拟器中的位置错误

java - 不使用 Maven 运行简单的 Spring 批处理作业?

c# - 为什么这在 C# 泛型中是不可能的?

java - 按值迭代 HashMap