2017-08-25 2 views
1

Der schwierige Teil ist, dass der Typ einen oberen begrenzten Wildcard enthält.Wie konvertiert man Iterator <? erweitert Person> zu Iterable?

Die Java-8 Konvertierung nicht funktioniert:

Iterator<? extends Person> it = null; 
Iterable<? extends Person> it2 =() -> it; 

Type mismatch: cannot convert from Iterator<capture#2-of ? extends Person> to Iterator<Person>

+0

Sie können ein 'Iterable 'zu einem' Iterable ', weil es keine Consumer-Methoden gibt. –

+0

Warum nicht [Iterator.forEachRemaining] (https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#forEachRemaining-java.util.function.Consumer-) verwenden? – SpaceTrucker

Antwort

3

Eine Hilfsmethode kann dies ohne die Notwendigkeit löst Warnungen zu unterdrücken, oder irgendetwas Stimmen:

Iterator<? extends Number> iterator = null; 
Iterable<? extends Number> iterable = toIterable(iterator); 

public static <T> Iterable<T> toIterable(Iterator<T> it) { 
    return() -> it; 
} 
+4

genau. Dies wird als "Wildcard-Erfassung" bezeichnet: https://docs.oracle.com/javase/tutorial/java/generics/capture.html – Eugene

0

Eine einfache Wrapper-Klasse dies tun könnte.

class IteratorIterable<T> implements Iterable<T> { 
    final Iterator<T> it; 

    public IteratorIterable(Iterator<T> it) { 
     this.it = it; 
    } 

    @Override 
    public Iterator<T> iterator() { 
     return it; 
    } 
} 

public void test() { 
    Iterator<? extends Person> it = null; 
    for (Person person : new IteratorIterable<>(it)) { 
     System.out.println(person); 
    } 
} 

Beachten Sie, dass dies fast sicher fehlschlagen wird, wenn es mehr als einmal verwendet wird.

1

Wo hast du diesen Iterator aus?
Soweit ich weiß ist der einzige Weg Iterator<E> durch Iterable<T>.iterator() zu erhalten.
Sowieso, wenn Sie einen Iterator haben, können Sie die Iterable mit einer while Schleife rekonstruieren:

while (it.hasNext()) { 
     it2.append(it.next); // just fill a new Iterable (if you can) 
    } 

Und wenn Sie the docs lesen, könnte etwas klarer bekommen.

Verwandte Themen