25

私は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

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

どうも

4

6 に答える 6

46

次のようにします:

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

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

于 2011-12-15T07:08:26.203 に答える
24

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

さらに、APIドキュメントでは、サブリストが元のリストにマップされたリストを返すように指定されているため、注意してください。

于 2011-05-31T15:13:24.453 に答える
8

これを試して...

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);
于 2011-05-31T15:14:28.403 に答える
3

試す

List<Integer> sub = alist.subList(2, 4);
于 2011-05-31T15:14:51.317 に答える
2
    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のimplのように、@George Kastrinisが可能な限りインターフェイスを使用すると述べたように、それはリストを返します。

于 2012-10-31T01:47:55.043 に答える
0

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

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

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

于 2011-05-31T15:17:35.163 に答える