Java创建Iterable<;?扩展超类>;来自迭代器<;子类>;毫无预兆

Java创建Iterable<;?扩展超类>;来自迭代器<;子类>;毫无预兆,java,generics,java-8,iterable,method-reference,Java,Generics,Java 8,Iterable,Method Reference,如何正确地创建一个Iterable好的,我找到了我想要的东西,它实际上非常简单: private String foo(Deque<String> words) { Iterator<String> iterator = words.descendingIterator(); return String.join(" ", (Iterable<String>) () -> iterator); } 私有字符串foo(Deque单词){

如何正确地创建一个
Iterable好的,我找到了我想要的东西,它实际上非常简单:

private String foo(Deque<String> words) {
    Iterator<String> iterator = words.descendingIterator();
    return String.join(" ", (Iterable<String>) () -> iterator);
}
私有字符串foo(Deque单词){
迭代器迭代器=words.degendingIterator();
返回String.join(“,(Iterable)(->迭代器);
}
根本不需要使用通配符。

您也可以尝试:

private String foo(Deque<String> words) {
    return String.join(" ", (Iterable<String>) words::descendingIterator);
}
私有字符串foo(Deque单词){
返回String.join(“,(Iterable)words::descendingIterator);
}
但对于一般情况,最好创建一个实用方法:

public static <T> Iterable<T> iterable(Iterable<T> iterable) {
    return iterable;
}
publicstaticiterable(Iterable-Iterable){
返回可编辑;
}
然后像这样简单地使用它:

 private static String foo(Deque<String> words) {
    return String.join(" ", iterable(words::descendingIterator));
}
私有静态字符串foo(Deque字){
返回String.join(“,iterable(words::genderingiterator));
}

这里有两个明显的问题:
String.join
使用
Iterable
,而不是
迭代器。另外,您为什么要使用供应商lambda表达式?您的问题是您所说的第一个“问题”的答案:
.stream().collect(join(“”)
@boristesspider
.stream()
words.stream()
的顺序与我预期的不符。您可以使用
.spliterator()
Iterable
创建流,但您需要再次使用
Iterable
。无论如何,
.join()
方法只是一个例子。不确定为什么您认为无法从
迭代器创建
流。做到这一点,不要创建不合规的
Iterable
实现;使用lambdas或其他方式。很高兴您最终决定接受自己的答案。:-)听到你反对我的第一个解决方案(社区投票支持率高)的论点会很有趣。@ETO:我从来没有说过你的答案不好(我投票支持率高)。只是这正是我一直在寻找和回答的原始问题:如何正确地创建一个iTerableDon’t调用您的答案的正确方式。让社区来决定答案的正确性。首先,我不会因为接受自己的答案而赢得声誉。第二,选择哪一个答案被接受是给提出问题的人的,他根据自己所寻找的来选择答案。这就是stackoverflow的方式,我有时看到错误/不完整的答案被接受。这并不完美,但这就是为什么你有更高的票数来排列答案。第三,我编辑了我的答案,不称之为“正确的方式”,因为你对正确措辞的看法是正确的。
public static <T> Iterable<T> iterable(Iterable<T> iterable) {
    return iterable;
}
 private static String foo(Deque<String> words) {
    return String.join(" ", iterable(words::descendingIterator));
}