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
可能な限り、コレクションのインターフェイスを使用する必要があります。サブリストの結果をダウンキャストしていますが、APIはList
(notArrayList
)を返すと指定しています。ここでは、実装者は自分の生活をより簡単にするために別の型を返すことを選択しています。
さらに、APIドキュメントでは、サブリストがオリジナルにマップされたリストを返すと指定されているため、注意してください!
次のようにしてください:
List sublist = new ArrayList();
sublist = new ArrayList<String>(alist.subList(2, 4));
そしてそれはうまくいくはずです
これを試して...
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);
試す
List<Integer> sub = alist.subList(2, 4);
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が可能な限りインターフェイスを使用すると言っているように、それは戻りリストです。
コードを次のように変更します。
_List<Integer> sub = alist.subList(2, 4);
_
sublist()
メソッドはList
を返しますが、これは必ずしもArrayList
ではありません(ここでは実際にはRandomAccessSublist
であり、キャストが失敗する理由です)。