首页 > 解决方案 > Java从 Iterator创建 Iterable没有警告

问题描述

如何正确创建Iterable<? extends SuperClass>from Iterator<SubClass>

假设我有一个Iterator<String>并且我想使用一个采用Iterable<? extends CharSequence>. 这当然是不可能的:

private String foo(Deque<String> words) {
    Iterator<String> iterator = words.descendingIterator();
    return String.join(" ", () -> iterator);
}

我发现使它编译的唯一方法是

private String foo(Deque<String> words) {
       Iterator<? extends CharSequence> iterator = words.descendingIterator();
       return String.join(" ", () -> (Iterator<CharSequence>) iterator);
}

但我收到未经检查的演员表警告。有没有办法以干净的方式做到这一点?

标签: javagenericsjava-8iterablemethod-reference

解决方案


你也可以试试:

private String foo(Deque<String> words) {
    return String.join(" ", (Iterable<String>) words::descendingIterator);
}

但对于一般情况,最好创建一个实用方法:

public static <T> Iterable<T> iterable(Iterable<T> iterable) {
    return iterable;
}

然后像这样简单地使用它:

 private static String foo(Deque<String> words) {
    return String.join(" ", iterable(words::descendingIterator));
}

推荐阅读