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));
}
如何从 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));
}