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

如何在Java中获取有效的子列表?,java,arraylist,sublist,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>(); al

我觉得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);
    }
}
packagejavatest;
导入java.util.ArrayList;
公共类JavaTest{
公共静态void main(字符串[]args){
ArrayList alist=新的ArrayList();
8.添加(10);
3.添加(20);
3.增加(30);
3.添加(40);
3.添加(50);
3.增加(60);
3.增加(70);
增加(80);
ArrayList sub=(ArrayList)alist.subList(2,4);
for(整数i:sub)
系统输出打印LN(i);
}
}
运行:线程“main”中出现异常 java.lang.ClassCastException: java.util.RandomAccessSubList不能 转换为java.util.ArrayList javatest.javatest.main(javatest.java:17) Java结果:1

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


Thx

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

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

试试这个

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 alist=new ArrayList();
8.添加(10);
3.添加(20);
3.增加(30);
3.添加(40);
3.添加(50);
3.增加(60);
3.增加(70);
增加(80);
列表子列表=列表子列表(2,4);
for(整数i:sub)
系统输出打印LN(i);
试试看

List sub=alist.subList(2,4);
将代码更改为:

List<Integer> sub = alist.subList(2, 4);
List sub=alist.subList(2,4);
sublist()
方法返回一个
List
,它不一定是
ArrayList
(这里实际上是一个
RandomAccessSublist
,这就是强制转换失败的原因)。

将其设置为:

List sublist = new ArrayList();
sublist = new ArrayList<String>(alist.subList(2, 4));
List sublist=new ArrayList();
子列表=新的数组列表(列表.子列表(2,4));
它应该可以工作

公共列表子列表(int-fromIndex,int-toIndex){
    public List<E> subList(int fromIndex, int toIndex) {
    return (this instanceof RandomAccess ?
            new RandomAccessSubList<E>(this, fromIndex, toIndex) :
            new SubList<E>(this, fromIndex, toIndex));
    }
return(这是RandomAccess的实例吗? 新的RandomAccessSubList(从索引到索引): 新的子列表(这个,从索引到索引); }
就像ArrayList的impl一样,正如@George Kastrinis所说,这是返回列表
尽可能使用接口。

坚持使用接口列表,而不是实现,你会没事的。检查zeropage的答案。我只是希望傻瓜列表的子列表也会是傻瓜列表。我认为这是合理的想法。无论如何thx:)@Helper方法:thanx,修复:)这是非常不正确的。第一行绝对没有效果。它创建了一个新的数组列表,在创建新的ArraysList时,该列表仅在下一行孤立。使用从alist.subList返回的值初始化新的ArrayList。但这与由alist支持的alist.subList非常不同。
    public List<E> subList(int fromIndex, int toIndex) {
    return (this instanceof RandomAccess ?
            new RandomAccessSubList<E>(this, fromIndex, toIndex) :
            new SubList<E>(this, fromIndex, toIndex));
    }