toArray()-Methode wie einsetzen?

jf

Bekanntes Mitglied
Hallo ich habe aktuell ein mir unverständliches Problem: ich möchte eine ArrayList in ein Array wandeln.

Java:
	List<MyType> m_entries = new ArrayList<MyType>();
	// Array mit 3 MyType-Instanzen befüllen (sind auch wirklich da)...
	return (MyType[])m_entries.toArray();	// hier haut es leider eine ClassCastException rein

Warum passiert dies und wie kann ich das Problem umgehen?
 

Lumaraf

Bekanntes Mitglied
List#toArray() gibt immer ein Object[] zurück. Was du brauchst ist die Methode List#toArray(T[]).

Java:
return m_entries.toArray(new MyType[m_entries.size()]);
 

jf

Bekanntes Mitglied
Danke, das hat funktioniert! :)
- Da wird der Rückgabetyp von List#toArray(T[]) wohl auch über Generics festgelegt.

Was mich dabei aber noch interessieren würde ist, warum Java keinen Cast von Object[] zu MyType[] hinbekommt, auch wenn im Object-Array definitiv MyTypen stecken. Was ist hierfür die Erklärung?
 
S

SlaterB

Gast
in einem Object[] kann z.B. ein Integer-Objekt drinstecken,
warum sollte so ein Array ein MyType[] sein dürfen?

schlimm genug ist, dass es andersrum gar funktioniert:
Java:
public class Test
{
    public static void main(String[] args)
    {
        String[] a = new String[1];
        a[0] = "test";

        Object[] o = a;
        o[0] = new Integer(3000); // ArrayStoreException, es dürfen ja nur Strings rein,
           // anderenfalls hätte man Probleme wenn man aus a[0] danach einen String lesen will

    }
}
 

jf

Bekanntes Mitglied
in einem Object[] kann z.B. ein Integer-Objekt drinstecken,
warum sollte so ein Array ein MyType[] sein dürfen?
Entschuldige bitte - aber hier komme ich nicht mit... ???:L

Natürlich muss ein Object[] ein MyType[] sein dürfen, schießlich können in dem Object-Array nur MyType-Instanzen liegen.
Das es in meinem Fall auch wirklich so ist, weiß ich ja. - Daher wollte ich auch den Cast machen.

Da ich die Liste mit einem Generic deklariert habe, sollte die Liste auch wissen, was für ein Array zurückzugeben ist.
Wahrscheinlich ist dies aber nicht möglich, weil man eine Liste auch ohne Generic deklarieren kann und in diesem Fall MUSS die Liste ein Object-Feld zurückgeben. Und da man eine Methode nicht mit einer anderen überladen kann, welche einen anderen Rückgabetyp liefert, aber gleiche Funktionsparameter erfordert (in diesem Fall keinen), ist eine so praktische Methode eben nicht möglich.
=> Hier wäre eine Anwendungspflicht für Generics sicherlich die sauberere Lösung.

Die Frage besteht aber nach wie vor: warum funktioniert der Cast nicht?
- Ich kann ja ohne Probleme ein Component-Object in einen JButton casten. (natürlich nur, wenn auch wirklich ein JButton drin steckt!)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
eine einzelne Variable/ ein Objekt ist was anderes als ein Array, schau dir diesen Code an:
Java:
Object o = new JButton();
JButton b = (JButton) o;

o = new Integer(300);
o.toString();

b.addActionListener(..);
mit der o-Variablen kann man nicht viel machen außer Object-Methoden aufzurufen und vielleicht andere Objekte zuzuweisen,
was dann der b-Variable herzlich egal ist, kein Fehler möglich,

anders ist das beim Object[]
Java:
Object[] o = new Object[1];
o[0] = new JButton();

JButton[] b = (JButton[]) o; // hier schon Exception, aber angenommen das ginge,
   // zu diesem Zeitpunkt sind ja auch nur JButtons drin, falls das ein Kriterium wäre (ist es nicht)


// o = new Object[2];

o[0] = new Integer(300);
JButton b = b[0]; // was steht in b[0]?
in Zeile 11 gäbe es eine Exception, denn b und o sind ja noch dasselbe eine Array-Objekt,
an Position 0 steht dort ein Integer, wie soll das JButton sein?

erst an dieser Stelle eine unvermutete Exception zu werfen ist nicht sinnvoll,
auch nicht den 'Cast' nur dann zu erlauben, falls danach kein gefährlicher Code kommt oder so,

also ist die Konsequenz:
lieber gleich den Cast verhindern, das geht einfach nicht (auch wenn in die andere Richtung leider erlaubt, siehe vorherigen Post)

------

würde die auskommentierte Zeile 8 ausgeführt, wäre die Situation ähnlich wie bei der einzelnen Object-Variable:
dem b-Array wäre es egal was im nun separaten anderen o-Array passiert, aber ein Array kann nunmal in mehreren Variablen stecken

ein Cast soll auch keine automatische Kopie eines Objektes/ eines Arrays erstellen, das wäre eine ganz andere Aufgabe
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor
Ich kann ja ohne Probleme ein Component-Object in einen JButton casten. (natürlich nur, wenn auch wirklich ein JButton drin steckt!)
Hier steckt kein JButton drin hier muss die Component ein JButton sein, damit der Cast funktioniert.

Grundsätzlich kann man mittels einer Variable die als Object[] deklariert wurde, aber auf ein MyType[] referenziert, dessen Inhalt per Cast wieder durch eine als MyType[] deklarierten Variable referenzieren.

Wenn Du aber die toArray() Methode ohne Generics nutzt wird hier eine Object Array erstellt, zwar gefüllt mit MyType Objekten aber eben kein MyType Array. Die Methode weiss ja gar nicht was für ein Array zu haben willst. Daher gibt es ja die zweite generische Methode mit der man den Rückgabetyp definieren kann.

Der erste Fall wäre so, als wenn Du die Bierflaschen aus dem Kasten nimmst und in einen Eimer stellst und versuchst am Pfandautomaten den Eimer mit den Bierflaschen zurückzugeben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T toArray() - Nachteile Allgemeine Java-Themen 2
M ArrayList<Object[]> und toArray() Allgemeine Java-Themen 5
D toArray() bei ArrayList casten Allgemeine Java-Themen 10
S toArray Castingproblem Allgemeine Java-Themen 4
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
BRoll Methode abbrechen (Invoke von außen) Allgemeine Java-Themen 5
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1
M Fabrik Methode, gutes Beispiel? Allgemeine Java-Themen 0
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
N WaitForScript- methode in javafx Allgemeine Java-Themen 1
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
M Eine static-Methode verlassen Allgemeine Java-Themen 2
P "Overriden statische Methode" Statische Methode die vererbt wird Allgemeine Java-Themen 5
X Komponente an Methode übergeben Allgemeine Java-Themen 1
A Methode ergibt Java NullpointerException. Allgemeine Java-Themen 3
S Getestete Methode um das Beste aus URL-Nutzereingaben rauszuholen..? Allgemeine Java-Themen 4
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben