Как получить действительный подсписок в Java? - PullRequest
25 голосов
/ 31 мая 2011

У меня странная (я думаю) проблема в 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

Как правильно составить подсписок?

Thx

Ответы [ 6 ]

46 голосов
/ 15 декабря 2011

сделать так:

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

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

24 голосов
/ 31 мая 2011

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

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

8 голосов
/ 31 мая 2011

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

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);
3 голосов
/ 31 мая 2011

Попробуйте

List<Integer> sub = alist.subList(2, 4);
2 голосов
/ 31 октября 2012
    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 сказал, что, по возможности, используйте интерфейс.

0 голосов
/ 31 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...