1

ユーティリティクラスの1つに、コレクションとクラスオブジェクトを受け取り、指定されたクラスのインスタンスであるコレクションのすべてのメンバーを反復処理できるIterableインスタンスを返すメソッドがあります。その署名は次のとおりです。

public static <T> Iterable<T> iterable (
      Iterable<? super T> source, Class<T> requiredClass);

これはほとんどのユースケースで非常にうまく機能しますが、今度はジェネリッククラスで使用する必要がありますItem<PROTOTYPE>。結果のイテレータによって返されるアイテムが特定のプロトタイプを持つことを保証できないことを確信できないことを理解しているので、次のようにそのリターンをキャストしようとしました。

Iterable<Item<?>> allItems = (Iterable<Item<?>>) 
                            TypeCheckingIterator.iterable(source, Item.class);

残念ながら、これはコンパイラエラー「Cannotcastfromto」を返しますIterable<Item>Iterable<Item<?>>

かなり楽しくキャストできるItemのに、なぜこのキャストができないのですか?Item<?>イテレータによって返されたアイテムを明示的にキャストせずに、強制的にこのキャストを作成する方法はありますか?

4

1 に答える 1

2

安全であることが確実な場合は、型消去を使用できます

Iterable<Item<?>> allItems = (Iterable<Item<?>>) (Iterable)
                        TypeCheckingIterator.iterable(source, Item.class);

また

Iterable<Item<?>> allItems =
                     TypeCheckingIterator.<Item<?>>iterable(source, Item.class);
于 2012-07-22T11:32:20.960 に答える