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);
    }
}

运行:线程“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

您应该尽可能使用 Collections 的接口。您正在向下转换子列表的结果,但 API 指定它返回List( not 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 中一样,它是 return List,正如@George Kastrinis 所说,尽可能使用接口。

于 2012-10-31T01:47:55.043 回答
0

将代码更改为:

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

sublist()方法返回 a List,它不一定是 a ArrayList(这里它实际上是 a RandomAccessSublist,这就是强制转换失败的原因)。

于 2011-05-31T15:17:35.163 回答