小编use*_*411的帖子

为什么java Iterable接口不能使用泛型通配符?或者:为什么我不能重写iterator()方法返回子类的Iterator?

我有一些类:SearchResponse,SearchResponseHit,SpecialSearchResponse(扩展SearchResponse)和SpecialSearchResponseHit(扩展SearchResponseHit).

SearchResponse看起来像这样:

public class SearchResponse implements Iterable<SearchResponseHit> {

    [...]

    public Iterator<SearchResponseHit> iterator() {
        return searchResponseHits.iterator();
    }
}
Run Code Online (Sandbox Code Playgroud)

这使我可以在foreach循环中使用SearchResponse的实例,如下所示:

for (SearchResponseHit hit : mySearchResponse) {
    [...]
}
Run Code Online (Sandbox Code Playgroud)

现在,当我有一个SpecialSearchResponse实例时,我想做的,但无法弄清楚如何编译这段代码:

for (SpecialSearchResponseHit specialHit : mySpecialSearchResponse) {
    [...]
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下编译器错误:

Type mismatch: cannot convert from element type SearchResponseHit to SpecialSearchResponseHit
Run Code Online (Sandbox Code Playgroud)

如果我尝试将此代码添加到SpecialSearchResponse:

public Iterator<SpecialSearchResponseHit> iterator() {
    [...]
}
Run Code Online (Sandbox Code Playgroud)

......我收到错误:

The return type is incompatible with Iterable<SearchResponseHit>.iterator()
Run Code Online (Sandbox Code Playgroud)

我尝试将SearchResponse中的方法更改为:

    public Iterator<? extends SearchResponseHit> iterator() {
        return searchResponseHits.iterator();
    }
Run Code Online (Sandbox Code Playgroud)

......但这给了我错误:

The return type is incompatible with Iterable<SearchResponseHit>.iterator()
Run Code Online (Sandbox Code Playgroud)

然后我尝试将类定义更改为: …

java generics overriding iterable

4
推荐指数
1
解决办法
2890
查看次数

标签 统计

generics ×1

iterable ×1

java ×1

overriding ×1