Array von generischem Typ erstellen

firefexx

Mitglied
Hallo, ich habe eine Art Liste geschrieben die Arrays von generischen Typen aufnehmen kann.

Wenn ich jetzt ein solches Array erstellen will schreibe ich:

Java:
T[] newArray = new T[N];
wobei N eine Variable für die Größe des Arrays ist.

Das resultiert im Fehler
"Generische Feldgruppe T kann nicht erstellt werden"

Dann versuche ich es so:
Java:
T[] newArray = new Object[N];

Dann gibts den Fehler
"Typabweichung: Konvertierung ob Object[] auf T[] nicht möglich"

Nächster Versuch:
Java:
T[] newArray = (T[]) new Object[N];

Endlich kein Fehler mehr, aber noch eine Warnung:
"Typsicherheit: Ungeprüfte Umwandlung von Object[] zu T[]"

Was will mir die Warnung sagen und kann ich das Problem irgendwie beheben?
(Abgesehen davon mit @SuppressWarnings zu arbeiten)

VG
 
F

Firephoenix

Gast
Hi,
du könntest dir dazu mal anschauen wie das ganze in ArrayList gelöst wurde:
java.util: ArrayList.java

Ich glaube eine 100% cleane Methode ohne Supress-Warnings oder Casting geht in dem Fall nicht, evtl hat hier jemand noch einen besseren Ansatz als die Java-Source :)

Gruß
 

firefexx

Mitglied
Joa da halten sie das ganze als Object[], casten zwischendurch und benutzen SuppressWarnings.

Da kann ich wahrscheinlich direkt so machen wie ich zuletzt geschrieben habe?!

VG
 

xehpuk

Top Contributor
Ohne @SuppressWarnings wird es nicht gehen.

Hier kommt dann aber ein richtig typsicheres Array raus:
Java:
@SuppressWarnings("unchecked")
static <T> T[] array(Class<T> componentType, int length) {
	return (T[]) Array.newInstance(componentType, length);
}
 

firefexx

Mitglied
Hi, danke für die Antwort.

Ich habe dazu noch ein paar Fragen.

Inwiefern bietet diese Methode eine Verbesserung gegenüber
Java:
T[] newArray = (T[]) new Object[N];
? Was ist da der Vorteil?

Wie würde man die Methode dann aufrufen?
Java:
array(T.getClass(), N);
??
Ich würde wahrscheinlich schreiben
Java:
T[] newArray = (T[]) Array.newInstance(T.getClass(), N);
Müsste das gleiche sein, oder?


Und noch eine Frage zur Notation:

static <T> T[] array( ...
Wozu ist das <T> gut? Reicht es nicht wenn T[] da steht?
Wenn ich jetzt z.B. eine get Methode schreibe hat die folgende Signatur:
Java:
public T get(int pos)
Sollte da auch noch <T> vor das T??


VG
 
S

Spacerat

Gast
[OT]Tja, die Klasse Array... immer wenn man die verwendet, wird einem vorgeworfen Reflection zu verwenden, was ja vermieden werden soll. Ist vllt. noch jemand ausser mir der Ansicht, dass man die Methoden dieser Klasse getrost in die Klasse [c]java.util.Arrays[/c] zu kopieren, damit man blos nicht mehr in diesen Verdacht gerät? Ich finde nämlich, herauszufinden, ob es sich bei einem Objekt um ein Array handelt oder auch wie hier ein typsicheres generisches Array zu erstellen, hat nur noch sehr wenig mit Reflection zu tun. Ausserdem liesse sich dort eine Factory-Methode ebenso wie in xehpuks Beispiel einfügen und man hätte das SupressWarnings("unchecked") nicht mehr im eigenen Code.[/OT]
Also ich erstelle mir schon lange keine generischen Arrays mehr. Mit [c]List<UndTuecke>[/c] und den entsprechenden [c]toArray()[/c] Methoden geht das viel komfortabler.
 
Zuletzt bearbeitet von einem Moderator:
F

Firephoenix

Gast
Noch als Literaturanmerkung zu dem Thread:

Das Buch "Effective Java" von Joshua Bloch behandelt unter anderem auch solche Fallstricke von Generics und liefert verschiedene Lösungsansätze bzw wägt verschiedene Lösungsmöglichkeiten gegeneinaner ab.

Ich hab leider das Werk gerade nicht zur Hand - fand aber die entsprechenden Kapitel zu Generics sehr lesenswert.

Gruß
 

firefexx

Mitglied
Hi, wieso ist es eigentlich so verpönt Reflection zu benutzen?
Ich sehe auch nicht wie dieser Anwendungsfall viel damit zu tun hat.


Zu deinem Vorschlag mit List und toArray Methoden:
Bei mir geht es grade sehr um Effizienz. Daher wird eine ArrayList implementiert (nicht die java.util) die eine Liste von Arrays erhält um die Vorteile von Arrays und Listen zu vereinen. Das Array jetzt als Liste zu verwalten wäre fatal für die Aufgabe. Da bleiben dann nur die Nachteile von verketteten Listen.
(bevor jetzt andere Vorschläge kommen: das ganze ist ne Uni-Aufgabe, ich darf mir jetzt nix komplett neues ausdenken).
 

Marco13

Top Contributor
Inwiefern bietet diese Methode eine Verbesserung gegenüber
Java:
T[] newArray = (T[]) new Object[N];
? Was ist da der Vorteil?

Der erste und wichtigste Vorteil ist: Sie funktioniert. Also, OHNE eine ClassCastException zu werfen ... ;)

Wie würde man die Methode dann aufrufen?
Java:
array(T.getClass(), N);
??
Ich würde wahrscheinlich schreiben
Java:
T[] newArray = (T[]) Array.newInstance(T.getClass(), N);
Müsste das gleiche sein, oder?

Das geht beides nicht. Es gibt "T" nicht mehr, wenn das Programm läuft. T.getClass() kann man also nicht aufrufen. Das class-Objekt muss woanders herkommen.

Und noch eine Frage zur Notation:

static <T> T[] array( ...
Wozu ist das <T> gut? Reicht es nicht wenn T[] da steht?
Wenn ich jetzt z.B. eine get Methode schreibe hat die folgende Signatur:
Java:
public T get(int pos)
Sollte da auch noch <T> vor das T??

Das eine ist ein statischer Aufruf, das andere nicht. Genaugenommen kann man in spitzen Klammern den Typparameter vor eine Methode schreiben, wenn "T" sonst nirgendwo steht:
Java:
class Example // <- Hier steht kein Typ
{
    <T> void doit(T t0, T t1) { ... } // <- Aber hier: Der gilt nur für die Methode
}

Ggf. aufpassen:
Java:
class Example<T> // <- Hier steht ein Typ
{
    <T> void doit(T t0, T t1) { ... } // <- Aber hier AUCH - der "überdeckt" das "T" von oben
}
(das sollte aber z.B. Eclipse mit einer Warning ankreiden)
 

firefexx

Mitglied

Landei

Top Contributor
Du musst es höchstpersönlich erzeugen und übergeben. Wird auch in den Java-APIs bei ähnlichen Problemen mit Type Erasure so gemacht (etwa im [c]EnumMap[/c]-Konstruktor).
 

firefexx

Mitglied
Ja xD also ich hab den Konstruktor erfolgreich mit T = Character aufrufen können und alle geschrieben Methoden erfolgreich getestet. Kann mir jemand ein Beispiel und einen Grund nennen dass es nicht funktioniert?

VG
 

Marco13

Top Contributor
Wenn das hier
Java:
public class GenericArrayTest<T>
{
    T[] newArray = (T[]) new Object[3];
    
    public static void main(String[] args)
    {
        GenericArrayTest<String> s = new GenericArrayTest<String>();
        s.newArray[0] = "Hello";
    }
}

keine Exception wirft, hast du ein anderes Java als ich...
 

firefexx

Mitglied
Bei mir ist die Struktur etwas anders.

Eine Klasse ArrayList hält eine Liste von Listen-Elementen die wiederum Elemente beinhalten die einerseits ein solches generisches Array halten und sich merken wie viele Elemente in diesem Array sind (ungleich null). Um ein neues Element einzufügen gibt es eine add Methode in ArrayList. Diese erstellt auch ggf. das neue Array.

Java:
	public static void main(String[] args) {
		ArrayList<String> l = new ArrayList<String>(3);
		l.add("Hello").add("2").add("3").add("4").add("5").add("6");
		System.out.println(l.get(0));
	}


relevanter Ausschnitt aus der add Methode:
Java:
@SuppressWarnings("unchecked")
			T[] newArray = (T[]) new Object[N];
		newArray[0] = element;
		KeyItem<T> newKeyItem = new KeyItem<T>(newArray, 1);
		list.add(newKeyItem);

Das klappt ohne Exception. ^^

VG
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
M Array Rang eines Elements Allgemeine Java-Themen 4
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
noah1407 Array Allgemeine Java-Themen 3
D Methoden Teil-Array mit Maximalwert bestimmen Allgemeine Java-Themen 23
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
N zweidimensionalen Array in dreidimensionalen Array speichern Allgemeine Java-Themen 4
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
L Array und Index Allgemeine Java-Themen 26
L die 3 größten Zahlen im Array Allgemeine Java-Themen 1
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
Willi.We Array sortieren Allgemeine Java-Themen 5
gotzi242 Array Summe bestimmen tipps? Allgemeine Java-Themen 14
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
V4ll3.Wff Array in Java Allgemeine Java-Themen 4
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
H Array Sportschütze Allgemeine Java-Themen 6
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
M Array verändern Allgemeine Java-Themen 1
A JavaFX 2 dimensionales array Allgemeine Java-Themen 1
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
H Array mit dem Datentype String[] initializieren Allgemeine Java-Themen 7
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
parrot Array Aufgabe Allgemeine Java-Themen 3
N String Array Eingabe Allgemeine Java-Themen 6
R Warum wird mir in der Konsole das "Standard Array" ausgegeben? Allgemeine Java-Themen 2
N Variablen Array Länge ändern. Allgemeine Java-Themen 8
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
W Enumeration ein Array/List als Eigenschaft mitgeben - warum geht das nicht? Allgemeine Java-Themen 0
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
A Array Problem Allgemeine Java-Themen 8
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
F Datei in String-Array einlesen Allgemeine Java-Themen 8
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
E Angabe wie groß Array sein soll und in for-schleifen diesen Array füllen Allgemeine Java-Themen 3
F 3 Dimensionales Array mit Allgemeine Java-Themen 9
M Steueralgorithmus verwandelt Array in Anfangszustand Allgemeine Java-Themen 9
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
T Objekt in Array packen Allgemeine Java-Themen 6
M Zahlen in Array anordnen Allgemeine Java-Themen 8
M Eclipse Unvollständigen Array ansteuern Allgemeine Java-Themen 2
D Erste Schritte Im Array Werte tauschen Allgemeine Java-Themen 5
Xge For/Array Error: IndexOutOfBounds Allgemeine Java-Themen 4
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
J Variablen Array ertellen bei model.put Allgemeine Java-Themen 13
S Eindimensionales Array in zweidimensionales Array speichern Allgemeine Java-Themen 5
R convert 2d array list to 2d array Allgemeine Java-Themen 1
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
MiMa Array umbau oder Alternative? Allgemeine Java-Themen 5
L Datentypen 3D Array Allgemeine Java-Themen 3
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
E Swing Array mit Bildern in GUI darstellen Allgemeine Java-Themen 2
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
H Zweidimensionales Array - Zellen der Tabelle verbinden Allgemeine Java-Themen 2
M Zweidimensionales Array mit Binärzahlen füllen Allgemeine Java-Themen 8
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
G Array ohne Aufzählungszeichen ausgeben Allgemeine Java-Themen 6
J Wie kann ich ein Java Array als Säulendiagramm ausgeben? Allgemeine Java-Themen 2
Z 2D Array Pixels reparieren Allgemeine Java-Themen 2
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
B Polibios Array erweitern Allgemeine Java-Themen 1
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
J Array-List Bubble-Sort Allgemeine Java-Themen 12
4 Variablen Int-Array Int Zuweisen Allgemeine Java-Themen 7
J Array Allgemeine Java-Themen 8
Z Array mit unterschiedlichen Werten Allgemeine Java-Themen 1
L sortiertes Array im main aufrufen klappt nicht. Allgemeine Java-Themen 3
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
A Mit dem letzten bis zum ersten Wert aus Array rechnen Allgemeine Java-Themen 15
A Vector Strings in Array splitten Allgemeine Java-Themen 6
I Muster in Array suchen Allgemeine Java-Themen 10
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8
B Zahlen manuell eingeben und in Array Speichern Allgemeine Java-Themen 2
R Wärmeleitung, 3d-Array Allgemeine Java-Themen 2
T Java Array in Methoden Allgemeine Java-Themen 1
D Erste Schritte Array von einer forschleife nach ausserhalb trasferieren Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben