La manière de voter, ArrayList<> Liste<>
Quelqu'un peut-il svp m'expliquer pourquoi je ne peux pas coulé List<>
à ArrayList<>
avec la première approche, et je le fais avec le second? Merci.
Première approche:
ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token));
Deuxième approche:
ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token));
Vous devez vous connecter pour publier un commentaire.
Lorsque vous faites la seconde, vous faites un new arraylist, vous n'êtes pas en essayant de faire semblant de l'autre liste est une liste de tableaux.
Je veux dire, que si la liste d'origine est mis en œuvre comme une linkedlist, ou certains de liste personnalisé? Vous ne savez pas. La deuxième approche est préférée si vous avez vraiment besoin de faire une liste de tableaux à partir du résultat. Mais vous pouvez laisser une liste, qui est l'un des meilleurs avantages de l'utilisation d'Interfaces!
Lorsque vous utilisez la deuxième méthode vous sont en cours d'initialisation arraylist avec ses valeurs prédéfinies.
Comme en général, nous ne
Liste de tableaux listofStrings = new ArrayList<>();
Disons que vous avez un tableau avec des valeurs, maintenant, vous voulez convertir ce tableau dans la liste de tableaux.
vous devez d'abord obtenir la liste à partir de la matrice à l'aide de Tableaux utils.
Parce que la liste de tableaux est en béton type de mettre en œuvre la Liste de l'interface. Il n'est pas garanti que la méthode asList, sera de retour ce type de mise en œuvre.
alors vous pouvez l'utilisateur constructoru d'une arraylist pour instancier avec des valeurs prédéfinies.
Ainsi, votre deuxième approche est de travail que vous avez passé de valeurs qui vont intantiate arraylist avec les éléments de la liste.
Plus sur
ArrayList est retourné à partir de Tableaux.asList n'est pas une liste de tableaux, c'est juste un wrapper qui ne permet aucune modification dans la liste.
Si vous essayez d'ajouter ou de supprimer des Tableaux.asList il vous donnera
La deuxième approche est clairement erroné si vous voulez lancer. Il instancier une nouvelle liste de tableaux.
Cependant la première approche devrait fonctionner très bien, si et seulement si getAllTasks retour une liste de tableaux.
Il est vraiment nécessaire pour vous d'avoir une liste de tableaux ? n'est-ce pas la Liste dans l'interface assez ? Ce que vous faites peut conduit à l'Exception d'Exécution si le type n'est pas correct.
Si getAllTasks() retourne une liste de tableaux, vous devez changer le type de retour dans la définition de la classe et puis vous n'aurez pas besoin d'un plâtre et si elle retourne quelque chose d'autre, vous ne pouvez pas lancer de ArrayList.
Essaie juste de faire ceci :
La première approche est en train de jeter de la liste, mais cela ne peut fonctionner que si le
List<>
ont été unArrayList<>
. Ce n'est pas le cas. Si vous avez besoin de la seconde approche, qui est la construction d'une nouvelleArrayList<>
avec les éléments de laList<>
Vous pouvez lancer la Liste des<> pour ArrayList<> si vous comprenez ce que vous faites. Compilateur Java ne pas le bloquer.
Mais:
De cette façon, mieux:
if (list instanceof ArrayList<Task>) {
ArrayList<Task> arraylist = (ArrayList<Task>) list;
}
ArrayList<Task> arraylist = Lists.newArrayList(list);
Parce que dans le premier , vous êtes en essayant de convertir une collection à une liste de tableaux.
Dans le 2ème , il vous suffit d'utiliser le construit dans le constructeur de liste de tableaux
Essayez d'exécuter le code suivant:
Vous obtiendrez le résultat suivant:
Donc, cela signifie qu'ils sont 2 classes différentes qui ne sont pas d'étendre les uns des autres. java.util.Tableaux$ArrayList signifie la classe privée nommée ArrayList (intérieur de la classe des Tableaux de classe) et java.util.ArrayList signifie le public classe ArrayList. Ainsi, la conversion de java.util.Tableaux$ArrayList pour java.util.Liste de tableaux et vice versa sont sans/pas disponible.
Peut être: