【发布时间】:2021-05-19 10:24:24
【问题描述】:
我有以下方法:
private void updateEntries(List<Data> data, List<Order> orders) {
// processing code here
List<Order> updates = new ArrayList<>();
for(Data d: data) {
Order anOrder = createOrder(d);
if(anOrder != null) {
updates.add(anOrder);
}
}
orders.clear();
orders.addAll(updates);
}
方法createOrder 将基于Data 参数创建Order 的子类型。这部分编译。
但问题是方法的调用代码不会编译,因为它是这样调用的:
updateEntries(List<Data> data, List<PendingOrder> orders)
和
updateEntries(List<Data> data, List<ExecutedOrder> orders)
这两个都是Order 的子类型,因此代码不会在方法的调用端编译。
如果我更新代码如下:
private void updateEntries(List<Data> data, List<? extends Order> orders) {
// processing code here
List<Order> updates = new ArrayList<>();
for(Data d: data) {
Order anOrder = createOrder(d);
if(anOrder != null) {
updates.add(anOrder);
}
}
orders.clear();
orders.addAll(updates); // <= does not compile
}
问题出在以下行:orders.addAll(updates);
这当然不会编译,因为列表被声明为List<? extends T>,并且它试图避免在列表中添加不同类型的项目。
那么我怎样才能使用泛型,以便我重用函数并能够更新方法中的列表?
【问题讨论】:
-
@matt: 哪个是“原始列表”?调用代码?在调用代码中,现有代码正在使用此类引用,我无法更改该代码区域。我只想为两种列表类型重用该方法
-
"调用代码?"是的,您不包含的代码,但对有人找到您的解决方案非常有帮助。您所描述的内容实际上是不可能的,因为您有一个
List<Execute>或List<PendingOrder>并且您想在其中添加一个Order。 -
@matt:调用代码是:
updateEntries(data, listOfPendingOrders)和updateEntries(data, listOfExecutedOrders)。两者都是Order的子类型 -
您实际上并没有展示这些列表的创建过程。或者他们正在使用的课程。你应该做一个完整的例子。提供的答案应该可以编译,但由于您无法编译,因此缺少一些细节。
标签: java generics generic-list