質問

    

この質問にはすでに回答があります:

         

クラスBがクラスAを拡張するとします。 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>

のサブタイプではない

JLSが明示的に言及している

  

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

パフォーマンスへの影響を最小限に抑えながら、何らかのタイプセーフティを保持する方法は、ラッパー。この例はコレクションに関するもので、リストの場合は非常によく似ています。おそらくいつかそれも書きます。私の前に誰かが来たら、コードを共有しましょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top