У меня есть несколько классов: SearchResponse, SearchResponseHit, SpecialSearchResponse (расширяет SearchResponse) и SpecialSearchResponseHit (расширяет SearchResponseHit).Почему интерфейс java Iterable не может использовать подстановочный шаблон generics? Или: почему я не могу переопределить метод iterator(), чтобы вернуть Iterator для подкласса?
SearchResponse выглядеть примерно так:
public class SearchResponse implements Iterable<SearchResponseHit> {
[...]
public Iterator<SearchResponseHit> iterator() {
return searchResponseHits.iterator();
}
}
Это делает возможным для меня, чтобы использовать экземпляр SearchResponse в цикле Еогеасп, как это:
for (SearchResponseHit hit : mySearchResponse) {
[...]
}
Теперь, что я хочу do, но не может выяснить, как сделать этот код компиляцией, когда у меня есть экземпляр 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()
I попытались изменить метод в 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
Я думаю, это проблема генериков, а не Iterable. Кроме того, вы не показали, что 'SearchResponse' расширяет' SearchResponseHit'. – user845279
Ну, независимо от того, как классифицировать эту проблему («generics» или «Iterable»), проблема реальна и ощутима. Кроме того, SearchResponse не поддерживает и не должен расширять SearchResponseHit, поэтому откуда вы это взяли? – user1442411
Mybad, я имел в виду 'SpecialSearchResponse', но я понимаю, что вы имеете в виду. – user845279