J'ai ce problème bizarre (je pense) en Java. J'ai une ArrayList et je veux prendre une sous-liste. Mais je reçois l'exception suivante.
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);
}
}
exécuter: exception dans le thread "principal" Java.lang.ClassCastException: Java.util.RandomAccessSubList ne peut pas être converti en Java.util.ArrayList à javatest.JavaTest.main (JavaTest.Java:17) Java (Java $ == = Résultat: 1
Quelle est la bonne façon de prendre une sous-liste?
THX
Vous devez travailler avec les interfaces pour les collections dans la mesure du possible. Vous abaissez le résultat de la sous-liste, mais l'API spécifie qu'elle renvoie List
(pasArrayList
). Ici, les implémenteurs choisissent de retourner un type différent pour leur faciliter la vie.
De plus, la documentation de l'API spécifie que la sous-liste renverra une liste mappée sur l'original, alors méfiez-vous!
faire comme:
List sublist = new ArrayList();
sublist = new ArrayList<String>(alist.subList(2, 4));
et ça devrait marcher
Essaye ça...
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);
Essayer
List<Integer> sub = alist.subList(2, 4);
public List<E> subList(int fromIndex, int toIndex) {
return (this instanceof RandomAccess ?
new RandomAccessSubList<E>(this, fromIndex, toIndex) :
new SubList<E>(this, fromIndex, toIndex));
}
comme dans l'implémentation d'ArrayList, il s'agit de la liste de retour, comme @George Kastrinis l'a dit dans la mesure du possible.
Changez le code en:
List<Integer> sub = alist.subList(2, 4);
La méthode sublist()
renvoie un List
, qui n'est pas nécessairement un ArrayList
(ici c'est en fait un RandomAccessSublist
, c'est pourquoi le transtypage échoue).