Подтвердить что ты не робот

Как сделать действительный подсписок в Java?

У меня есть эта странная (я думаю) проблема в 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 не может быть брошенным в java.util.ArrayList на javatest.JavaTest.main(JavaTest.java:17) Java Результат: 1

Каков правильный способ подписи?

спасибо

4b9b3361

Ответ 1

Вы должны работать с интерфейсами для коллекций, где это возможно. Вы уменьшаете результат подсписок, но API указывает, что он возвращает List ( не ArrayList). Здесь разработчики предпочитают возвращать другой тип, чтобы облегчить их жизнь.

Furthemore, документация API указывает, что подсписок вернет список, сопоставленный с оригиналом, поэтому будьте осторожны!

Ответ 2

сделать это как:

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

и он должен работать

Ответ 3

Попробуйте это...

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

Ответ 4

Try

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

Ответ 5

    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 сказал, что использование интерфейс, где это возможно.

Ответ 6

Измените код на:

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

Метод sublist() возвращает a List, который не обязательно является ArrayList (здесь он фактически является RandomAccessSublist, поэтому сбой выполняется).