web-dev-qa-db-fra.com

Comment convertir ArrayList <> à partir de la liste <>

Quelqu'un peut-il m'expliquer pourquoi je ne peux pas lancer List<> à ArrayList<> avec la première approche et je fais avec la seconde? Merci.

Première approche:

ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token));

Deuxième approche:

ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token));
38
Eugene

Lorsque vous faites le deuxième, vous créez une nouvelle liste, vous n'essayez pas de prétendre que l'autre liste est une liste.

Je veux dire, que se passe-t-il si la liste d'origine est implémentée en tant que liste chaînée ou en tant que liste personnalisée? Tu ne le sauras pas. La deuxième approche est préférable si vous avez vraiment besoin de créer une liste d'array à partir du résultat. Mais vous pouvez simplement le laisser sous forme de liste, c'est l'un des meilleurs avantages de l'utilisation des interfaces!

29
corsiKa

Lorsque vous utilisez la seconde approche, vous initialisez l'arraylist avec ses valeurs prédéfinies. Comme généralement, nous faisons ArrayList listofStrings = new ArrayList <> (); Disons que vous avez un tableau avec des valeurs, maintenant vous voulez convertir ce tableau en tableau.

vous devez d'abord obtenir la liste du tableau à l'aide des utilitaires Arrays. Parce que ArrayList est un type concret qui implémente l'interface List. Il n'est pas garanti que la méthode asList renvoie ce type d'implémentation.

List<String>  listofOptions = (List<String>) Arrays.asList(options);

vous pouvez ensuite utiliser le constructeur d'une liste de tableaux pour instancier avec des valeurs prédéfinies.

ArrayList<String> arrlistofOptions = new ArrayList<String>(list);

Donc, votre deuxième approche fonctionne que vous avez passé des valeurs qui intenteront l'arraylist avec les éléments de la liste.

De plus

ArrayList renvoyée par Arrays.asList n'est pas une liste de tableaux réelle, c'est juste un wrapper qui ne permet aucune modification dans la liste. Si vous essayez d'ajouter ou de supprimer sur Arrays.asList, cela vous donnera

UnsupportedOperationException

13
Harsh

La deuxième approche est clairement fausse si vous voulez lancer. Il instancie une nouvelle liste de tableaux.

Cependant, la première approche devrait fonctionner très bien, si et seulement si getAllTasks renvoie un ArrayList.

Il vous faut vraiment une ArrayList? l'interface List n'est-elle pas suffisante? Ce que vous faites peut entraîner une exception d'exécution si le type n'est pas correct.

Si getAllTasks () retourne un ArrayList, vous devez changer le type de retour dans la définition de classe et vous n'aurez alors pas besoin de transtypage et s'il renvoie autre chose, vous ne pouvez pas transtyper en ArrayList.

5
krtek

Essayez ceci:

ArrayList<SomeClass> arrayList;

 public SomeConstructor(List<SomeClass> listData) {
        arrayList.addAll(listData);
}
4
vikas kumar

La première approche consiste à diffuser la liste, mais cela ne fonctionnerait que si le List<> était un ArrayList<>. Ce n'est pas le cas. Vous avez donc besoin de la deuxième approche, à savoir la construction d'un nouveau ArrayList<> avec les éléments du List<>

2
jdehaan

Vous pouvez convertir List <> en ArrayList <> si vous comprenez ce que vous faites. Java ne le bloquera pas.

Mais:

  1. Il n'est pas recommandé de convertir le type parent en type enfant (ou l'interface avec le type d'implémentation) sans vérification. De cette façon mieux:

if (list instanceof ArrayList<Task>) { ArrayList<Task> arraylist = (ArrayList<Task>) list; }

  1. Vous n'avez peut-être pas besoin du type d'implémentation comme référence. Regardez l'avertissement SonarQube https://sbforge.org/sonar/rules/show/squid:S1319 . Vous pouvez éviter ce casting dans la plupart des cas.
  2. Vous pouvez utiliser la méthode Guava: ArrayList<Task> arraylist = Lists.newArrayList(list);
2
Atetc

Parce que dans le premier, vous essayez de convertir une collection en ArrayList. Dans le 2ème, vous utilisez simplement le constructeur intégré de ArrayList

1
Yossale

Essayez d'exécuter le code suivant:

List<String> listOfString = Arrays.asList("Hello", "World");
ArrayList<String> arrayListOfString = new ArrayList(listOfString);
System.out.println(listOfString.getClass());
System.out.println(arrayListOfString.getClass());

Vous obtiendrez le résultat suivant:

class Java.util.Arrays$ArrayList
class Java.util.ArrayList

Donc, cela signifie qu'il s'agit de 2 classes différentes qui ne s'étendent pas. Java.util.Arrays $ ArrayList signifie la classe privée nommée ArrayList (classe interne de la classe Arrays) et Java.util.ArrayList signifie la classe publique nommée ArrayList. Ainsi, la conversion de Java.util.Arrays $ ArrayList en Java.util.ArrayList et vice versa n'est pas pertinente/n'est pas disponible.

1
rebulanyum

Peut être:

ArrayList<ServiceModel> services = new ArrayList<>(parking.getServices());
intent.putExtra("servicios",services);
0
Rolfy Montufar