私はArrayListを使用していて、その一部を別のArrayListにコピーしようとしています。
sibling.keys = (ArrayList<Integer>) keys.subList(mid, this.num);
ここで、「sibling.keys」は新しいArrayListで、「keys or this.keys」は古いArrayListです。 Eclipseがそうするように私に言ったので、キャストを使用しましたが、それからClassCastException
をスローします:
Java.util.ArrayList $ SubListをJava.util.ArrayListにキャストできません
何かアドバイス?
subList
は、既存のリストでviewを返します。 ArrayList
ではありません。 copyを作成できます:
sibling.keys = new ArrayList<Integer>(keys.subList(mid, this.num));
または、ビューの動作に満足している場合は、コピーを作成する必要がないように、sibling.keys
のタイプをList<Integer>
ではなくArrayList<Integer>
に変更してください。
sibling.keys = keys.subList(mid, this.num);
ただし、違いを理解することは重要です-sibling.keys
を変更しますか(たとえば、値を追加したり、既存の要素を変更したりします)? keys
を変更しますか?あるリストの突然変異が他のリストに影響を与えたいですか?
ArrayList.subList()がArrayListを返さないのにArraListを予期しているため、クラスキャスト例外が発生します。 sibling.keysをArrayListからListに変更で、正常に動作するはずです。これにより、ClassCastExceptionが回避されるだけでなく、キャストも不要になります。