2

我有以下代码段:

public void reorder(int fromIndex, int toIndex) {
    getElements().add(toIndex, getElements().remove(fromIndex));
}

在这里,该方法getElements具有返回类型List<?>。该remove方法具有返回类型?,并且该add方法将其参数显示为int index, ? element。所以我的假设是,由于方法的返回类型和remove方法的第二个参数add是相同的——?方法调用必须成功。但是,我错了,上面的代码段导致错误:

The method add(int, capture#17-of ?) 
in the type List<capture#17-of ?> 
is not applicable for the arguments (int, capture#18-of ?)

在这里,我没有任何直接访问列表的权限,也不知道它是getElements方法返回的原始类型。我在这里想要的只是删除项目fromIndex并将其放在toIndex. 那么,我该如何实现呢?我对泛型的理解也有什么问题吗?

4

3 回答 3

4

不不不!使用捕获:

public void reorder(int fromIndex, int toIndex) {
    reorderWithCapture(getElements());
}

private <E> void reorderWithCapture(List<E> elements) {
    elements.add(toIndex, elements.remove(fromIndex));
}
于 2012-05-11T09:51:57.253 回答
2

只需添加一个使?具体的演员表:

public void reorder(int fromIndex, int toIndex) {
  final List<Object> els = (List<Object>)getElements();
  els.add(toIndex, els.remove(fromIndex));
}

由于您只是重新排列列表中的元素,因此这不会造成任何麻烦。但我必须说,如果您看到这种返回值,则设计有问题。

于 2012-05-11T09:04:15.600 回答
1

通配符?表示任何(未知)类型,而不是一种特定类型。因此编译器无法验证调用中使用的any类型是否与and调用中使用的any 类型remove相同。这从错误消息中可以看出,前者被描述为,而后者被描述为。这些被编译器视为两种不同的、不相关的类型。getElementsaddcapture#18-of ?capture#17-of ?

由于您显然无法修改这些方法的定义(尽管根据您的描述它们肯定看起来很可疑),所以这里最糟糕的选择可能是@Marko 建议的:将过程的两个步骤分开并使用带有 a 的临时变量具体类型参数 ( Object) 使编译器满意。

于 2012-05-11T09:08:29.983 回答