Java创建Iterable <!-?从Iterator <subclass>扩展SuperClass->而不发出警告

时间:2019-01-15 18:41:04

标签: java generics java-8 iterable method-reference

如何从Iterable<? extends SuperClass>创建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);
}

但是我收到了未经检查的演员警告。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

您也可以尝试:

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

答案 1 :(得分:1)

好的,我找到了正确的方法,实际上很简单:

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

完全不需要使用通配符。