【发布时间】:2020-02-17 16:16:30
【问题描述】:
我想从ArrayList 的末尾删除删除元素并将其设置在i 的位置。我不关心元素的顺序,但我希望这个操作是 O(1)。
我的代码:
private void removeElement(int i, List<? extends MyClass> objects) {
if (i >= objects.size() - 1) {
objects.remove(objects.size() - 1);
} else {
objects.set(i, objects.remove(objects.size() - 1));
}
}
通过这样做,我将从我的 ArrayList 中删除 i 索引处的对象,时间复杂度为 O(1)。
我的问题是 Java 不允许我在 i 位置设置已删除的元素。我得到:
第二个参数类型错误。成立 '?扩展MyClass',需要'?扩展 MyClass'。
我知道“生产者扩展消费者超级”规则。我知道 ? extends MyClass 对象可能与确切的 ? extends MyClass List 泛型类型不同。但是不应该允许插入从同一个列表中检索到的元素吗?
【问题讨论】:
-
它不知道该项目已从同一列表中删除。 Java 首先计算所有参数,然后调用方法。
-
您真的需要一个上限通配符列表,还是可以摆脱 ?延伸?
标签: java generics collections