web-dev-qa-db-ja.com

Java:コレクション型をサブタイプにキャスト

クラスBがクラスAを拡張するとします。私はたまたま知っているList<A>がありますonlyにはBのインスタンスが含まれています。 List<A>List<B>にキャストする方法はありますか?

私の唯一のオプションは、コレクションを反復処理し、一度に1つの要素をキャストして、新しいコレクションを作成することです。これは、型の消去が与えられたリソースの完全な無駄のようで、実行時にこれを完全に不要にします。

36
Landon Kuhn

型なしのListインターフェースを使用してキャストできます。

List<A> a = new ArrayList<A>();
List<B> b = (List)a;
45
jarnbjo

あなたはこれを試すことができます:

List<A> a = new ArrayList<A>();
List<B> b = (List<B>) (List<?>) a;

それはjarnbjoの答えに基づいていますが、生のリストを使用しないでください。

16
Romain

パフォーマンスへの影響を最小限に抑えて型の安全性を維持する方法は、 ラッパー を使用することです。この例はコレクションに関するもので、リストのケースは非常によく似ているので、いつか私もそれを書きます。誰かが私の前に来たら、コードを共有しましょう。

1
zakmck

List<A>List<B>!のサブタイプではありませんではありません

JLSはそれについて明示的に言及しています

サブタイピングはジェネリック型を介して拡張されません:T <: UC<T> <: C<U>を意味しません。

1
Joachim Sauer