クラスB
がクラスA
を拡張するとします。私はたまたま知っているList<A>
がありますonlyにはB
のインスタンスが含まれています。 List<A>
をList<B>
にキャストする方法はありますか?
私の唯一のオプションは、コレクションを反復処理し、一度に1つの要素をキャストして、新しいコレクションを作成することです。これは、型の消去が与えられたリソースの完全な無駄のようで、実行時にこれを完全に不要にします。
型なしのListインターフェースを使用してキャストできます。
List<A> a = new ArrayList<A>();
List<B> b = (List)a;
あなたはこれを試すことができます:
List<A> a = new ArrayList<A>();
List<B> b = (List<B>) (List<?>) a;
それはjarnbjoの答えに基づいていますが、生のリストを使用しないでください。
パフォーマンスへの影響を最小限に抑えて型の安全性を維持する方法は、 ラッパー を使用することです。この例はコレクションに関するもので、リストのケースは非常によく似ているので、いつか私もそれを書きます。誰かが私の前に来たら、コードを共有しましょう。
List<A>
はList<B>
!のサブタイプではありませんではありません
サブタイピングはジェネリック型を介して拡張されません:
T <: U
はC<T> <: C<U>
を意味しません。