web-dev-qa-db-ja.com

Javaで有効なサブリストを取得するにはどうすればよいですか?

Javaでこの奇妙な(私は思う)問題があります。 ArrayListがあり、サブリストを取得します。しかし、次の例外が発生します。

package javatest;

import Java.util.ArrayList;

public class JavaTest {

    public static void main(String[] args) {
        ArrayList<Integer> alist = new ArrayList<Integer>();
        alist.add(10);
        alist.add(20);
        alist.add(30);
        alist.add(40);
        alist.add(50);
        alist.add(60);
        alist.add(70);
        alist.add(80);
        ArrayList<Integer> sub = (ArrayList<Integer>) alist.subList(2, 4);
        for (Integer i : sub)
            System.out.println(i);
    }
}

run:スレッド "main"の例外Java.lang.ClassCastException:Java.util.RandomAccessSubListは、javatest.JavaTest.main(JavaTest.Java:17)でJava.util.ArrayListにキャストできませんJava =結果:1

サブリストを取得する正しい方法は何ですか?

THX

25

可能な限り、コレクションのインターフェイスを使用する必要があります。サブリストの結果をダウンキャストしていますが、APIはListnotArrayList)を返すと指定しています。ここでは、実装者は自分の生活をより簡単にするために別の型を返すことを選択しています。

さらに、APIドキュメントでは、サブリストがオリジナルにマップされたリストを返すと指定されているため、注意してください!

24
stevevls

次のようにしてください:

List sublist = new ArrayList();
sublist = new ArrayList<String>(alist.subList(2, 4));

そしてそれはうまくいくはずです

46
SwapnilM

これを試して...

List<Integer> alist = new ArrayList<Integer>();
alist.add(10);
alist.add(20);
alist.add(30);
alist.add(40);
alist.add(50);
alist.add(60);
alist.add(70);
alist.add(80);
List<Integer> sub = alist.subList(2, 4);
for (Integer i : sub)
  System.out.println(i);
8

試す

List<Integer> sub = alist.subList(2, 4);
3
Thor
    public List<E> subList(int fromIndex, int toIndex) {
    return (this instanceof RandomAccess ?
            new RandomAccessSubList<E>(this, fromIndex, toIndex) :
            new SubList<E>(this, fromIndex, toIndex));
    }

arrayListの実装と同様に、@ George Kastrinisが可能な限りインターフェイスを使用すると言っているように、それは戻りリストです。

2
zg_spring

コードを次のように変更します。

_List<Integer> sub = alist.subList(2, 4);
_

sublist()メソッドはListを返しますが、これは必ずしもArrayListではありません(ここでは実際にはRandomAccessSublistであり、キャストが失敗する理由です)。

0
helpermethod