4
votes

Obtention de 'Incompatibilité de type: impossible de convertir ArrayList > en List >' lors de l'instanciation d'une liste de cartes

List<Map<String, String>> recordMapList = new ArrayList<LinkedHashMap <String,String>>();

0 commentaires

3 Réponses :


3
votes

La raison est que List n'est pas la sous-classe de List

Solution, vous n'avez pas besoin de le déclarer comme: p >

List<Map<String, String>> recordMapList = new ArrayList<Map<String,String>>();

vous pouvez le déclarer comme:

List<Map<String, String>> recordMapList = new ArrayList<HashMap<String,String>>();

puis mettre HashMap dans le recordMapList .


0 commentaires

1
votes

Je vous suggère d'éviter d'instancier une liste avec un type générique donné, c'est-à-dire:

List<Map<String,String>> recordMapList = new ArrayList<>(); // Declaration + Assignment
recordMapList.add(new HashMap<>()); // Add a first implementation of Map
recordMapList.add(new TreeMap<>()); // Add a second implementation of Map

C'est la convention d'affectation générique à partir de Java 7 (à partir de cette version, les types génériques collection sont déduits via le type déclaré). Pourquoi? Puisque le type déclaré des valeurs de liste a déjà été explicitement indiqué lors de la déclaration de la variable de liste générique. Les valeurs sont des instances de l'interface de la carte et seront fournies dans l'implémentation du code.

Lors de l'accès aux valeurs de la liste, ce qui compte, c'est l'interface utilisée ( Map ), et non son implémentation ( HashMap ). De cette façon, si l'implémentation Map est remplacée, il ne sera pas nécessaire de changer la valeur assignée de recordMapList.

Voir l'exemple suivant (qui montre comment la liste n'est pas liée par une implémentation de Map):

List<Map<String, String>> recordMapList = new ArrayList<>();

Référence:

Bonus :


0 commentaires

2
votes

Bien que ArrayList soit une sous-classe de List et que Map soit une sous-classe de HashMap , un List n'est PAS une sous-classe de List . De même, vous ne pouvez pas convertir une List en une List . Si nous le pouvions, cela signifierait que nous pourrions ajouter, disons, une TreeMap à notre List , puis la convertir en List code>, violant ainsi le contrat d'origine de la List .

Personnellement, j'utiliserais simplement un opérateur diamant (Java 7+) si la recordMapList -instance est immédiatement créé:

List<Map<String, String>> recordMapList;
...
recordMapList = new ArrayList<Map<String, String>>();

Et s'il est créé ailleurs, seule la List peut être une ArrayList , mais le reste le serait être le même. (REMARQUE: vous pouvez bien sûr toujours utiliser l'opérateur de diamant ici aussi, mais si la création de l'instance et le champ réel sont séparés, je préfère personnellement utiliser les types afin qu'il soit instantanément clair quel type va dans la liste, sans sauter à la champ réel dans le code.)

List<Map<String, String>> recordMapList = new ArrayList<>();

Dans les deux cas, vous pouvez ajouter vos instances HashMap à la recordMapList .


0 commentaires