- 締切済み
javaのRandomAccessSubListについて
javaについて質問です。 RandomAccessSubListとはいったい なんでしょうか? RandomAccessSubListをSerializableで型変換しようとしてもエラーになってしまいます。 具体例として今やりたいことは 20件のデータのうち、10件のみ取得して更新処理をしたいのですが、10件のみ取得するというメソッドが業務フレームワークで提供されています。Listで取得するのですが、その際にListの中身がRandomAccessSubListが入っているのです。その為、Serializable化しようとしてもエラーになってしまいます。 わかりにくい説明で申し訳ありませんが、知りたいことはRandomAccessSubListとはなんなのかということです。Listとなにが違うのか、具体的な利用例ではどう使われるのか? ご教授お願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- deadlock
- ベストアンサー率67% (59/87)
業務フレームワークはList#subList()を使用して、ArrayListなどから特定の部分を取り出しているのだと思います。作成元になるList(たぶんArrayListかVector、またはそれらのサブクラス)は、RandomAccessSubListクラスを内部的に使用することによって List#subList(int, int) の実装を共通化しているのでしょう。「java.utilパッケージの作者が楽したいから」というのが存在理由になると思います。 kacchannさんのおっしゃるとおり、Listインターフェースにあるメソッドのみを使用する(Iteratorを取得して繰り返し処理、get(int)で特定の要素を取り出すetc...)ことを目的とします。戻り値がListである以上はSerializableインターフェースなどの責務は範疇に入っていませんし、packageスコープに隠蔽されているのでキャストによって別のクラスやインターフェースとして使用することはあまりオススメできません。フレームワークやJDKなどの実装が変更された時に、自分のソースを修正するハメになるかもしれません。 シリアライズを行いたいのであれば new ArrayList(フレームワークから取得したList) のようにArrayListなどに生成しなおしてから使用するようにすれば上手くいくと思います。
- kacchann
- ベストアンサー率58% (347/594)
#1です。ちょっと間違えた。 RandomAccessSubListは「パッケージ外アクセス」が禁止されてるので 「RandomAccessSubList」としては、そもそも使えない。 (RandomAccessSubListへの)キャストも出来ない。 つまり 「(RandomAccessSubListというクラスの)性質上、使い道がない」のではなく、 「設計上、使えない」。 つまり(RandomAccessSubListとしては)「使い道」も「具体的な利用例」もない。
- kacchann
- ベストアンサー率58% (347/594)
>RandomAccessSubListとはなんなのか >Listとなにが違うのか RandomAccessSubListは「List」。 なので、 >具体的な利用例 ただ「List」として使うだけ。 その「返ってきたインスタンス」を わざわざRandomAccessSubListにキャストしてまで「利用」する利点は、 RandomAccessSubListの性質上、 まったくないと思う。 つまり、 やはり「RandomAccessSubListは単なるListと見るほかない」、と。
補足
ご回答ありがとうございます。 それではRandomAccessSubListはなぜ存在しているのでしょうか?使い道もなにもないならわざわざ作る必要はないはずです。 RandomAccessSubListが作成された目的が知りたいのです。