2017-08-25 7 views
1

トリッキーな部分は、型に上限があるワイルドカードが含まれていることです。イテレータを変換する方法<? Person>をIterableに拡張しますか?

のJava 8の変換がうまくいかない:

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

'Iterable <?を安全にキャストできますか? Person>を 'Iterable 'に拡張します。なぜなら、消費者メソッドがないからです。 –

+0

なぜ[Iterator.forEachRemaining](https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#forEachRemaining-java.util.function.Consumer-)を使用しないのですか? – SpaceTrucker

答えて

3

ヘルパーメソッドは、警告を抑制または何かをキャストする必要がなく、これを解決することができます:あなたがこのイテレータを手に入れた

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

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

。これは「ワイルドカード・キャプチャ」と呼ばれます。https://docs.oracle.com/javase/tutorial/java/generics/capture.html – Eugene

0

を単純なラッパークラスには、これを行うことができます。

これは、複数回使用するとほとんど確実に失敗することに注意してください。

1

を?
私が知る限り、Iterator<E>を取得する唯一の方法は、Iterable<T>.iterator()です。
とにかくあなたはIteratorを持っている場合、あなたはwhileループを使用してIterable再構築することができます。

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

をそして、あなたはthe docsを読めば、何かが明確に得ることができます。

関連する問題