Java создать Iterable <? расширяет Суперкласс> из Итератора <SubClass>без предупреждения - PullRequest
0 голосов
/ 15 января 2019

Как правильно создать 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);
}

Но я получаю предупреждение Unchecked . Есть ли способ сделать это чистым способом?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы также можете попробовать:

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));
}
0 голосов
/ 15 января 2019

ОК, я нашел правильный путь, и на самом деле все было довольно просто:

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

Нет необходимости использовать подстановочный знак вообще.

...