【发布时间】:2012-06-11 15:25:33
【问题描述】:
我有一些类:SearchResponse、SearchResponseHit、SpecialSearchResponse(扩展 SearchResponse)和 SpecialSearchResponseHit(扩展 SearchResponseHit)。
SearchResponse 看起来像这样:
public class SearchResponse implements Iterable<SearchResponseHit> {
[...]
public Iterator<SearchResponseHit> iterator() {
return searchResponseHits.iterator();
}
}
这使我可以在 foreach 循环中使用 SearchResponse 的实例,如下所示:
for (SearchResponseHit hit : mySearchResponse) {
[...]
}
现在,我想做但不知道怎么做,就是在我有一个 SpecialSearchResponse 实例时编译这段代码:
for (SpecialSearchResponseHit specialHit : mySpecialSearchResponse) {
[...]
}
这给了我以下编译器错误:
Type mismatch: cannot convert from element type SearchResponseHit to SpecialSearchResponseHit
如果我尝试将此代码添加到 SpecialSearchResponse:
public Iterator<SpecialSearchResponseHit> iterator() {
[...]
}
...我收到错误:
The return type is incompatible with Iterable<SearchResponseHit>.iterator()
我已尝试将 SearchResponse 中的方法更改为:
public Iterator<? extends SearchResponseHit> iterator() {
return searchResponseHits.iterator();
}
...但这给了我错误:
The return type is incompatible with Iterable<SearchResponseHit>.iterator()
然后我尝试将类定义更改为:
public class SearchResponse implements Iterable<? extends SearchResponseHit>
...但这给了我这个错误:
The type SearchResponse cannot extend or implement Iterable<? extends SearchResponseHit>. A supertype may not specify any wildcard
解决这个问题最好(也是最漂亮)的方法是什么?还是我必须跳过foreach-method(以及其他在后台使用Iterable接口的函数)并编写一个getSpecialIterator()方法,然后直接使用迭代器?
问候 /J
【问题讨论】:
-
我认为这是一个泛型问题,而不是 Iterable。此外,您还没有显示
SearchResponseextendsSearchResponseHit。 -
好吧,不管如何对这个问题进行分类(“泛型”或“Iterable”),问题都是真实而明显的。此外,SearchResponse 不会也不应该扩展 SearchResponseHit,那么您是从哪里得到的呢?
-
我的错,我的意思是
SpecialSearchResponse但我明白你的意思。
标签: java generics overriding iterable