例如,将Iterator <Object>强制转换为Set <String>的最佳方法

Whi*_*cal 6 java generics iterator casting set

铸造Iterator<Object>一个Set<String>

什么是最干净/最好的做法?

JB *_*zet 7

public Set<B> getBs(){
    Iterator<A> iterator = myFunc.iterator();
    Set<B> result = new HashSet<B>();
    while (iterator.hasNext()) {
        result.add((B) iterator.next();
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但是当然,如​​果A迭代器返回的所有s 都不是s ,它将失败B.

如果要过滤迭代器,请使用instanceof:

public Set<B> getBs(){
    Iterator<A> iterator = myFunc.iterator();
    Set<B> result = new HashSet<B>();
    while (iterator.hasNext()) {
        A a = iterator.next();
        if (a instanceof B) {
            result.add((B) iterator.next();
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

使用番石榴,以上可以减少到

return Sets.newHashSet(Iterators.filter(myFunc.iterator(), B.class));
Run Code Online (Sandbox Code Playgroud)