繁体   English   中英

Java泛型:以通配符(?)作为参数并返回类型

[英]Java Generics: The wildcard(?) as argument and return type

我有以下代码段:

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

在这里,方法getElements具有返回类型List<?> remove方法是否具有返回类型? ,并且add方法将其参数显示为int index, ? element 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 那么,我该如何实现呢? 我对泛型的理解也有什么问题吗?

不不不! 使用捕获:

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

private <E> void reorderWithCapture(List<E> elements) {
    elements.add(toIndex, elements.remove(fromIndex));
}

只需添加使它成功的演员表? 具体:

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

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

通配符? 表示任何(未知)类型 ,而不是一种特定类型。 所以编译器无法验证,在使用任何类型的 remove调用是一样的,在使用的任何类型 getElementsadd电话。 从错误消息中可以看到,前者被描述为capture#18-of ? 而后者是capture#17-of ? 编译器将它们视为两种不同的,不相关的类型。

由于您显然无法修改这些方法的定义(尽管根据您的描述它们肯定看上去很脏),因此@Marko建议的最差的选择是:将过程的两个步骤分开,并使用带有使编译器满意的具体类型参数( Object )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM