如何从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);
}
但是我收到了未经检查的演员警告。有没有办法做到这一点?
答案 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);
}
完全不需要使用通配符。