如何在Java中获取有效的子列表?

Geo*_*nis 25 java arraylist sublist

我在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 Code Online (Sandbox Code Playgroud)

run:线程"main"中的异常java.lang.ClassCastException:java.util.RandomAccessSubList无法强制转换为javatest.JavaTest.main中的java.util.ArrayList(JavaTest.java:17)Java结果:1

获取子列表的正确方法是什么?

谢谢

小智 46

把它当成:

List sublist = new ArrayList();
sublist = new ArrayList<String>(alist.subList(2, 4));
Run Code Online (Sandbox Code Playgroud)

它应该工作


ste*_*vls 24

您应该尽可能使用集合的接口.您正在向下转换子列表的结果,但API指定它返回List(而不是 ArrayList).在这里,实现者选择返回不同类型以使他们的生活更轻松.

此外,API文档指定子列表将返回映射到原始的List,所以要小心!

  • 我只是期望FooList的子列表也将是FooList.我认为这是合情合理的.无论如何thx :) (5认同)

Kar*_*Øie 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);
Run Code Online (Sandbox Code Playgroud)