1. ホーム
  2. java

[解決済み] List<SubClass> を List<BaseClass> にキャストする最も効率的な方法

2022-05-01 04:10:34

質問

私は List<SubClass> として扱いたい。 List<BaseClass> . をキャストするので、問題なさそうです。 SubClassBaseClass は簡単にできますが、私のコンパイラはキャストが不可能であると文句を言います。

では、同じオブジェクトを参照するためにはどうすればいいかというと List<BaseClass> ?

今は新しいリストを作って、古いリストをコピーしているだけです。

List<BaseClass> convertedList = new ArrayList<BaseClass>(listOfSubClass)

しかし、私の理解では、それは全く新しいリストを作成する必要があります。 できれば、元のリストへの参照が欲しいです!

解決方法は?

この種の割り当ての構文は、ワイルドカードを使用します。

List<SubClass> subs = ...;
List<? extends BaseClass> bases = subs;

ここで重要なのは List<SubClass> ではなく と互換性があります。 List<BaseClass> . への参照を保持するコード。 List<SubClass> は、リスト内のすべての項目が SubClass . 別のコードで、リストを List<BaseClass> を指定した場合、コンパイラは文句を言いません。 BaseClass または AnotherSubClass が挿入されます。しかし、これによって ClassCastException このコードでは、リスト内のすべての要素が SubClass .

一般的なコレクションは、Javaの配列と同じように動作するわけではありません。配列は共変であり、つまり、このようなことが許されるのです。

SubClass[] subs = ...;
BaseClass[] bases = subs;

これは、配列がその要素の型を知っているからです。もし誰かが SubClass を使用して)配列の中に bases を参照)、実行時例外がスローされます。

一般的なコレクションは ない この情報はコンパイル時に消去されます。したがって、無効なストアが発生したときに実行時例外を発生させることはできません。その代わり ClassCastException は、コレクションから値が読み込まれたときに、コード内のどこか遠くて関連づけにくいポイントで発生します。型安全性に関するコンパイラの警告に注意すれば、実行時にこのような型エラーが発生することはないだろう。