Collections Array mit generischen Typ

hansmueller

Bekanntes Mitglied
Hallo,

die Arrayerzeugung ist eigendlich ganz einfach:
Java:
Ding[] dingsda = new Ding[200]
Für ein mehrdimensionales Array hängt man einfach nur ein paar eckige Klammern zusätzlich dran.

Nur bei folgenden Fall funktioniert das nicht:
Ich hatte gerne ein mehrdimensionales Array mit einer ArrayList<String> als Typ.
Wenn ich es so schreibe, gibt mir Eclipse einen Fehler an:
Java:
ArrayList<String>[][] alDaten = new ArrayList<String>[10][11];
"Cannot create a generic array of ArrayList<String>" ist dieser Fehlerhinweis.

Wenn ich es so schreibe, gibt mir Eclipse nur noch eine Warnung:
Java:
ArrayList<String>[][] alDaten = new ArrayList[10][11];
"Type safety: The expression of type ArrayList[][] needs unchecked conversion to conform to ArrayList<String>[][]"

Wieso funktioniert die erste Schreibweise nicht? Formal müßte sie ja richtig sein.
Die zweite Schreibweise funktioniert zwar, aber was soll ich von diesen Warnhinweis halten? Und welche Auswirkungen könnte dies nach sich ziehen?
Ist das eine Besonderheit, die es bei diesen Generics bzw. Collections gibt?

MfG
hansmueller
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
ausprobieren ausprobieren, früher war sowas noch verbreitet, mit Mehrdimensionalität hat das doch überhaupt nichts zu tun,
wenn du
Java:
ArrayList<String>[] alDaten = new ArrayList<String>[10];
schreibst bzw. das andere auch nur mit einer Dimension, dann hast du exakt dasselbe...
ich passe den Titel an, entferne die Mehrdimensionalität

ansonsten ist nur zu sagen, dass Java Arrays + Generics leider nicht gut kombinieren kann,
die erste Variante ist schlicht verboten, die andere nicht gefährlicher als
Java:
ArrayList<String> al = new ArrayList();
mit derselben Warnung,
Probleme kann es da nicht geben direkt bei Objekterstellung
 

hansmueller

Bekanntes Mitglied
SlaterB hat gesagt.:
... mit Mehrdimensionalität hat das doch überhaupt nichts zu tun ...
Jup, das war mir schon klar (ich habe es ausprobiert), habe aber gerade den Fall, daß ich es eben gleich mehrdimensional brauche. Werde das nächste mal bei einer solchen Frage versuchen, das Problem auf den kleinsten Nenner zu kürzen.

Es geht mir eigendlich mehr um das Verständnis. Warum lassen sich Java Arrays + Generics nicht gut kombinieren? Warum ist die erste Variante verboten? Und die Warnung bei der zweiten Variante wird ja wohl nicht zum Spaß ausgegeben?

MfG
hansmueller
 
S

SlaterB

Gast
warum kann nicht wirklich beantworten, vielleicht hat jemands anders eine Kurzfassung, ansonsten lange Texte durchsuchen
Internet-Suche 'java generics arrays' führte soeben recht schnell zu

AngelikaLanger.com - Java Generics - Type Erasure - Angelika Langer Training/Consulting
2 Einschränkungen für Parametrisierte Typen
[..]
* Arrays. Ein parametrisierter Typ ist als Elementtyp eines Arrays nicht zugelassen. Das heißt, es darf zum Beispiel kein Array des Typs Comparable<String>[] deklariert oder erzeugt werden. Die einzige Ausnahme ist die Wildcard-Instanziierung des parametrisierten Types: eine Deklaration wie Comparable<?>[] ist erlaubt. Das Verbot parametrisierter Typen als Elementtyp eines Arrays ist zunächst einmal eine recht überraschende Einschränkung, die sich der Praxis dann auch als reichlich lästig erweist. Sehen wir uns die Hintergründe genauer an. Die Ursache der Einschränkung liegt wieder in der Type Erasure.
[..]
2.1 Keine parametrisierten Typen als Array-Elemente
[..]
2.2 Die Folgen ignorierter Warnungen [das interessiert dich ja anscheinend auch besonders ;) ]
 

hansmueller

Bekanntes Mitglied
Danke für den Link SlaterB.
Ist ein interessanter Artikel. Zwar keine leichte Lektüre aber mir ist die Sache jetzt schon etwas klarer.

Wenn ich es richtig verstanden habe, sollte ich mit
Java:
ArrayList<String>[][] alDaten = new ArrayList[10][11];
keine Probleme bekommen, solange ich nicht irgendwelche cast-Geschichten mache, um mit aller Gewalt dort eine ArrayList reinzudrücken.

Wenn keine weiteren Beiträge folgen, markiere ich heute Abend dieses Thema als erledigt.

MfG
hansmueller
 

andiv

Bekanntes Mitglied
Warum verwendest du überhaupt ein zweidimensionales Array einer ArrayList? Also eigentlich eine dreidimensionale Datenstruktur. Du könntest auch Listen ineinanderschachteln, also List<List<List<String>>>, dann wärst du von der Typsicherheit her jedenfalls auf der sicheren Seite.
 

hansmueller

Bekanntes Mitglied
@andiv: Die Idee hatte ich auch schon :), trotzdem danke für den Vorschlag.
Java:
		ArrayList<ArrayList<ArrayList<String>>> alDatenA = new ArrayList<ArrayList<ArrayList<String>>>();
		ArrayList<String> x = alDatenA.get(0).get(0);
		
		//versus
		
		ArrayList<String>[][] alDatenB = new ArrayList[10][11];
		ArrayList<String> y = alDatenB[0][0];

Ich wette, daß die verschachtelten Listen mehr Speicher und Rechengeschwindigkeit benötigen als das Array. Dem gegenüber steht die Typsicherheit und ein paar nützliche Methoden.

Da mein Programm, für das ich diese Datenstruktur brauche jetzt schon ganz schön am rechnen und speicherfressen ist, werde ich mich wohl für das Array entscheiden.

MfG
hansmueller
 

Antoras

Top Contributor
Mehrdimensionale Arrays betrachte ich immer skeptisch. Es ist nun mal schwer verständlich was sie machen sollen und bei
Code:
a.get(x).get(y).get(z)
oder
Code:
a[x][y][z]
ist es schwer zu erkennen was da eigentlich zurückkommt.
Wie befüllst du die Arrays denn? Von der Platte mit vordefinierten Werten oder dynamisch zur Laufzeit? Bei ersterem können mehrdimensionale Arrays sinnvoll sein, z.B. als statische Map für einen Wert mit einem Schlüssel dazu. Mehr als ein zweidimensionales Array hab ich aber noch nie gebraucht. Dafür dürfte Objektorientierung dann sinnvoller sein. Bei letzterem ist es immer fraglich ob statische Arrays so sinnvoll sind, z.B. beim Speicherplatz von Array vs. ArrayList wäre ich mir nicht so sicher. Ein
Code:
a[10][10][10]
verbraucht 10 * 10 * 10 Einheiten Speicherplatz, eine verschachtelte ArrayList hingegen kann viel weniger verbrauchen wenn nicht alle Elemente gefüllt werden.

Schon mal über ein bisschen Objektorientierung nachgedacht?
Code:
class Vector { int x,y,z }
ist meist verständlicher und man hat nur ein Array, das alle Vektoren beinhaltet.
 

hansmueller

Bekanntes Mitglied
@Antoras: Dein Beispiel mit den Vector kann ich leider nicht ganz nachvollziehen.

Meinst du etwa, daß ich eine Klasse schreiben soll, in der die Werte "Spalte x", "Zeile y" und die "ArrayList<String> alDaten" gespeichert werden und dann die Objekte dieser Klasse in einen Array packen soll?
Wäre auch eine Lösung, aber die Suche nach einen Eintrag in diesem Array ist bestimmt nicht die Schnellste.

MfG
hansmueller
 

Antoras

Top Contributor
Der Overhead durch die Objektorientierung ist vernachlässigbar wenn der Suchalgorithmus Müll ist. Will sagen: Hast du dir Gedanken darüber gemacht ob man den Suchalgorithmus verbessern könnte? Denn wenn nicht bringt es auch nichts sich Gedanken über ein paar Mikrooptimierungen zu machen und dadurch dann vllt. Code-Obfuskierungen in Kauf zu nehmen.
 

hansmueller

Bekanntes Mitglied
@Antoras: Ist ein bißchen viel Aufwand, einen eigenen ausgefeilten Suchalgorithmus zu schreiben.
Da verwende ich doch lieber bereits bestehenden Code in Form von mehrdimensionalen Arrays oder verschachtelten Listen (Auch ein Aspekt der OOP).
Und im Endeffekt ist es mit der Verständlichkeit auch nicht weit her.
Ob ich jetzt
Code:
ArrayList<String> a = alDatenLagerA.get(x).get(y);
,
Code:
ArrayList<String> b = alDatenLagerB[x][y];
oder
Code:
ArrayList<String> c = alDatenLagerC.getListe(x,y);
schreibe, ist ja wohl wirklich nicht der große Unterschied.

MfG
hansmueller
 

Antoras

Top Contributor
In der Objektorientierung kommt es in erster Linie nicht darauf an Daten miteinander zu gruppieren, sondern deren Abhängigkeiten zueinander zu analysieren und eine geeignete Datenstruktur darauf zu entwickeln. Bei einem
Code:
alDatenLagerC.getListe(x,y)
hättest du tatsächlich wenig gewonnen, aber vllt. gibt es ja die Möglichkeit diese Daten im voraus zu gruppieren, geschickt miteinander zu kombinieren und so eine geeignete Struktur zu finden.

Da kann ich dir leider nicht weiter helfen, da ich nicht weiß was du da für Daten hast und was du mit ihnen machen musst. Diese Analyse erfordert im übrigen eine gewisse Erfahrung und natürlich einen vllt. nicht unerheblichen Zeitaufwand. Mit Suchalgorithmus meine ich im übrigen nicht, dass du den selbst implementieren sollst, sondern dass du auf vorgefertigte Datenstrukturen zurückgreifst um die Daten einfacher und vor allem effizient wiederfinden zu können. Eine Suche in einer Liste/einem Array ist z.B. sehr teuer, eine Map oder ein Set ermöglichen hier Wunder und zwar ohne, dass du wissen musst wie sie funktionieren. Dafür sind sequentielle Datenstrukturen besser für ein Iterieren über deren Elemente geeignet.

Das Wissen welche Datenstruktur wo sinnvoll ist gehört zum Grundwissen jedes Programmierers und du wirst nicht drumherum kommen es dir anzueignen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Array mit generischen Typen casten? Java Basics - Anfänger-Themen 6
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
Temsky34 Array IndexOf nicht verfügbar Java Basics - Anfänger-Themen 18
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
L Frage zum Array Java Basics - Anfänger-Themen 1
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
Lion.King Array deklarieren und initialisieren Java Basics - Anfänger-Themen 5
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
AkiJou Zeile in 2d Array löschen Java Basics - Anfänger-Themen 2
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
A Elemente in einem Array Java Basics - Anfänger-Themen 5
A Vorkommende Farben ermittel und als Array zurückgeben Java Basics - Anfänger-Themen 7
AhmadSlack Array Java Basics - Anfänger-Themen 7
Jambolo Kartenhand Array Java Basics - Anfänger-Themen 14
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
EykS 3D Druckdatei basierend auf 3D Array? Java Basics - Anfänger-Themen 3
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
Chris.089 2 Werte im Array tauschen Java Basics - Anfänger-Themen 6
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
L Gridmuster in einem Array Java Basics - Anfänger-Themen 2
sgtcoopa Array übergeben Schleife Java Basics - Anfänger-Themen 0
B Compiler-Fehler Array aus Objekten übergeben Java Basics - Anfänger-Themen 7
padde479 Array Multiplikation der ersten n Zahlen Java Basics - Anfänger-Themen 7
G zweidimensionales int Array sortieren Java Basics - Anfänger-Themen 57

Ähnliche Java Themen

Neue Themen


Oben