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メソッド(およびバックグラウンドでIterableインターフェイスを使用する他の関数)をスキップしてgetSpecialIterator()メソッドを記述してから、イテレーターを直接使用する必要がありますか?
よろしく/J