Как сделать действительный подсписок в 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
Каков правильный способ подписи?
спасибо
Ответы
Ответ 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
, поэтому сбой выполняется).