Java 1.6: Erstellen eines Arrays von List

Warum kann ich ein Array von List nicht erstellen?

List[] nav = new List[] { new ArrayList() }; 

Eclipse sagt “Kann kein generisches Array von Listen erstellen”

oder

 ArrayList[] nav = new ArrayList[] { new ArrayList() }; 

Eclipse sagt “Kann kein generisches Array ArrayList erstellen”

oder

 List[] getListsOfStrings() { List groupA = new ArrayList(); List groupB = new ArrayList(); return new List[] { groupA, groupB }; } 

Aber ich kann das tun:

 List[] getLists() { return new List[] { new ArrayList(), new ArrayList() }; } 

Eclipse sagt, dass List und ArrayList unformatierte Typen sind, aber es kompiliert …

Scheint ziemlich einfach, warum wird es nicht funktionieren?

Nun, Generika Tutorial geben Sie die Antwort auf Ihre Frage.

Der Komponententyp eines Array-Objekts darf keine Typvariable oder ein parametrisierter Typ sein, es sei denn, es handelt sich um einen (unbegrenzten) Platzhaltertyp. Sie können Array- Typen deklarieren , deren Elementtyp eine Typvariable oder ein parametrisierter Typ, jedoch keine Array- Objekte ist .

Das ist natürlich ärgerlich. Diese Einschränkung ist notwendig, um Situationen wie:

 // Not really allowed. List[] lsa = new List[10]; Object o = lsa; Object[] oa = (Object[]) o; List li = new ArrayList(); li.add(new Integer(3)); // Unsound, but passes run time store check oa[1] = li; // Run-time error: ClassCastException. String s = lsa[1].get(0); 

Wenn Arrays des parametrisierten Typs zulässig wären, würde das vorherige Beispiel ohne unkontrollierte Warnungen kompilieren und dennoch zur Laufzeit fehlschlagen. Wir hatten Typensicherheit als primäres Gestaltungsziel von Generika.

Sie können im Allgemeinen keine Arrays generischer Typen erstellen.

Der Grund dafür ist, dass die JVM nicht prüfen kann, ob nur die richtigen Objekte (mit ArrayStoreExceptions) eingefügt werden, da der Unterschied zwischen List und List zur Laufzeit nicht besteht.

Natürlich können Sie den Compiler mit dem Raw-Typ List oder dem ungebundenen Platzhaltertyp List< ?> und dann (mit einer nicht aktivierten Umwandlung) in List . Aber es liegt in Ihrer Verantwortung, nur List und keine anderen Listen darin zu speichern.

Keine genaue Antwort, aber ein Tipp:

Das letzte Beispiel enthält eine Warnung vom Typ “Rohtyp”, weil Sie die Typisierung der Liste weggelassen haben. Es ist im Allgemeinen ein besserer (typsicherer) Ansatz, um anzugeben, welche Objekttypen in der Liste enthalten sind, was Sie bereits in den vorherigen Beispielen getan haben ( List statt List ).

Die Verwendung von Arrays ist keine bewährte Methode, da ihre Verwendung meistens Fehler enthält. Die Verwendung von Auflistungsklassen (Liste, Satz, Map, …) ermöglicht die Verwendung von Typisierung und von bequemen Methoden zur Handhabung ihres Inhalts; Sehen Sie sich nur die statischen Methoden der Collections-class an.

Verwenden Sie also einfach das Beispiel der vorherigen Antwort.

Eine andere Lösung besteht darin, LinkedList (oder ArrayList usw.) zu erweitern und dann ein Array der Unterklasse zu erstellen.

 private static class StringList extends LinkedList {} public static void main(String[] args) { StringList[] strings = new StringList[2]; strings[0] = new StringList(); strings[1] = new StringList(); strings[0].add("Test 1"); strings[0].add("Test 2"); strings[1].add("Test 3"); strings[1].add("Test 4"); System.out.println(strings[0]); System.out.println(strings[1]); }