Génériques Java: tableau contenant des génériques

Dupliquer possible:
Java comment: création de tableaux génériques
Erreur de création de tableau générique

J’ai été chargé d’écrire une table de hachage en Java, qui doit fonctionner avec n’importe quel type de données. Les règles relatives au code que j’écris sont les suivantes: – La structure de la table de hachage doit avoir un tableau, dont la taille est déterminée au moment de la construction de l’object. dans une liste liée, qui contient tous les éléments à cet index (clé) dans la table de hachage

Ainsi, pour le type de données sous-jacent, j’ai créé un tableau de type LinkedList (personnalisé, pas la API Java LinkedList).

private LinkedList[] table; 

Le problème est bien sûr d’instancier ce tableau. Voici quelques-unes de mes tentatives:

 public HashTable(int size) { table = new LinkedList[size]; } 

Cela génère une erreur de création de tableau générique au moment de la compilation.

 public HashTable(int size) { table = (LinkedList[])(new Object[size]); } 

Cela provoque une erreur ClassCastException au moment de l’exécution ( java.lang.Object ne peut pas être LinkedList en LinkedList ).

La personne qui dirige le projet ne sait pas non plus comment traiter ce problème. Est-il possible de modifier mon code afin que la table de hachage contienne toujours un tableau en tant que structure de données sous-jacente, les collisions étant placées dans une liste liée?

Cela a fonctionné pour moi:

 public class HashTable { private LinkedList table[]; @SuppressWarnings("unchecked") public HashTable(int size) { table = new LinkedList[size]; } } 

Par exemple:

 HashTable t = new HashTable(10); t.table[0] = new LinkedList(); t.table[0].add("test"); System.out.println(t.table[0].get(0)); 

Oui, le constructeur a généré un avertissement (qui explique l’annotation “non cochée”), mais le code fonctionne ensuite sans autre avertissement.

Utilisez simplement Object[] comme magasin de données et convertissez-le manuellement en un type spécifique. Ceci est acceptable dans la construction d’infrastructures, où les relations de type peuvent être plus difficiles que d’habitude.

Voici ce qu’il faut faire pour créer un tableau générique en Java:

 @SafeVarargs static  E[] newArray(int length, E... array) { return Arrays.copyOf(array, length); } //used in your example private LinkedList[] table; public HashTable(int size) { table = newArray(size); } 

Ce n’est pas idéal, mais vous pouvez faire ce genre de chose:

 import java.util.LinkedList; public class Test { static class HashTable { public HashTable(int size) { LinkedList[] table = (LinkedList[])java.lang.reflect.Array.newInstance(LinkedList.class, size); } } public static void main(Ssortingng[] args) { HashTable table = new HashTable(23); } }