代码之家  ›  专栏  ›  技术社区  ›  Ricola

Java创建迭代?从迭代器扩展超类>而不发出警告

  •  3
  • Ricola  · 技术社区  · 6 年前

    如何正确创建 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 回复  |  直到 6 年前
        1
  •  3
  •   ETO    6 年前

    您也可以尝试:

    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));
    }
    
        2
  •  1
  •   Ricola    6 年前

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

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

    根本不需要使用通配符。