Java 创建 Iterable<?在没有警告的情况下从 Iterator<SubClass> 扩展 SuperClass>

Java create Iterable<? extends SuperClass> from Iterator<SubClass> without warning

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

假设我有一个 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);
}

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

好的,我找到了我要找的东西,其实很简单:

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

根本不需要使用通配符。

您也可以试试:

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));
}