warum List<String>.toArray() return Object[] und kein String[]? wie um dies zu umgehen?
Weiß jemand warum Java 1.6 hat dieses Verhalten:
List<String> list = ArrayList<String>();
String[] arr = (String[]) list.toArray();
Und bekomme ich eine classcastexception-Fehler, da gibt es zurück Object[] und kein String[].
Dachte ich
List<T>.toArray()
sollte return T[] - Nein? Hat jemand eine Antwort, warum diese Problematik existiert in der Sprache?
Und auch, wie dies zu umgehen? Wie bekomme ich ein String [] List<String>
ohne Schleife durch die Elemente?
Jave nicht wirklich ein Konzept
möglich, Duplikat der java: (String[])Liste.toArray() gibt die classcastexception-Fehler
T[]
.möglich, Duplikat der java: (String[])Liste.toArray() gibt die classcastexception-Fehler
InformationsquelleAutor justadreamer | 2011-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie ein array übergeben, so dass seine Laufzeit-Typ kann verwendet werden, wie ein Hauch von
toArray
. VersuchentoArray(new String[0])
statt. Sie können auch in eine pre-sized array.Zu verstehen, betrachten, welche Art der Löschung zu tun haben müsste, um
Arbeit. Wenn Java erlaubt, dass die besten könnte es noch nach der Löschung ist
Meisten
toArray
Implementierungen verwendenjava.lang.reflektieren.Array
zu konstruieren, die ein Ausgabe-array der richtigen Art gegeben, die ein type-hint erlassen alsClass
.oder verwenden Sie
toArray(new String[list.size()])
wenn Sie möchten, um zu vermeiden, Zuweisung von ein-Größe-0-arraydanke. Bearbeitet zu reden presizing.
So die Antwort weiter unten sagt, dass die
List<E>
interface nicht bereitstellen kann, einE[] toArray()
Methode, weil Sie in Konflikt mit den älterenObject[] toArray()
- Methode, wurde in 1.2 und erforderlich für die Abwärtskompatibilität. Dies ist sinnvoll, da Sie nicht zwei Signaturen, die unterscheiden sich nur durch den Rückgabetyp. Aber deine Antwort impliziert, dassE[] toArray()
würde nicht funktionieren, weil der type-erasure - habe ich richtig gelesen? Oder ist es eine nuance, die zwischen Ihnen mitT
als Ihre generischen Typ der Liste und die Schnittstelle mitE
für seine Erklärung?Richtig, ich denke, ich verpasst das offensichtliche. Liste Methoden wie
E get(int index)
Arbeit, denn Sie sind erzwungen, zur compile-Zeit und nicht zu wissen, oder erstellen den Typ zur Laufzeit.E[] toArray()
hätte seine zurückgegebenen Wert Zuordnung/pass/etc. zur Laufzeit überprüft, sondern tatsächlich den Bau der array erfordert die Kenntnis des richtigen Typs.InformationsquelleAutor Mike Samuel
Da arrays haben in Java seit dem Beginn, während Generika wurden nur eingeführt, in Java 5. Und die
List.toArray()
Methode wurde in Java 1.2, bevor Generika gab, und so war es angegeben, um zurückObject[]
. Viel bestehenden code erwartet nunList.toArray()
zurückObject[]
, so dass es nicht geändert werden kann jetzt.Außerdem, generics werden zur Laufzeit gelöscht, so
ArrayList
konnte nicht einmal die Konstruktion eines Arrays von der richtigen Art, wenn er es wollte.Lücke für diese ist die
Liste.toArray(T[])
Methode, die Sie wieder ein array vom richtigen Typ sein, vorausgesetzt, Sie geben es ein array vom richtigen Typ und weiß daher, welche Art zu verwenden.Daniel, ernst? Diese Frage wurde gefragt, ALSO wie oft? Eine million? Und Sie wurden Vorträge mich auf die Beantwortung einer doppelten Frage?
Ich wusste gar nicht sofort sehen (noch spontan erinnern) ein exaktes Duplikat, wenn ich geantwortet habe gestern. Eine schnelle Suche heute aufgedreht diese one ich denke, das ist nah genug. Wenn du überzeugt bist, dass eine Frage ist ein Duplikat, dann eher als die Annahme schlechten glauben, warum nicht einfach die Abstimmung zu schließen, sich selbst? Sie haben genug rep.
Ich bin nicht sicher, dass es ganz irrelevant. Stimmt, Java 5 eingeführt Rückgabetyp Kovarianz -, und daher wäre es nicht unbedingt eine bedeutende änderung zurück
T[]
stattObject[]
. Aber wegen der seltsamen Art und Weise, in der array-Varianz funktioniert: würde es das richtig zurückT[]
? Meine Faustregel ist, dass Sie verwenden können, Generika, oder machen verwenden der array-Kovarianz, sollte aber vermeiden, versucht beides zur gleichen Zeit.Rückgabetyp Kovarianz (die sich mit der Rückkehr Typen, überschreiben von Methoden) nicht in Frage hier, da die
toArray()
Methoden in all Ihrer Superklassen (Sammlung) würde auch geändert werden, umT[]
. Zu deiner Frage, ob es richtig wäre, vorausgesetzt, dass eine Methode könnte magisch return T[], richtig wäre es in den meisten Fällen, weilT[]
ist eine Unterklasse vonObject[]
, wer also erwartet, dass einObject[]
sollte in der Lage sein zu nehmen, einT[]
. Die einzige Ausnahme wäre, wenn Sie versuchten, dann fügen Sie ein element in das array an eine andere Art, eine sehr ungewöhnliche Möglichkeit.InformationsquelleAutor Daniel Pryden
Zu verstehen, warum das passiert, werfen Sie einen Blick auf die javadoc für
"Sammlung".toArray()
und dann Blick auf die"Sammlung".toArray(T[] a)
Methode. Beachten Sie auch, dass die generics in Java sind gelöscht runtime.InformationsquelleAutor Costi Ciudatu
Die Gründe sind zwei:
Die Methode vorangestellt Generika und Sie konnte es nicht ändern, die Signatur ohne brechen der Rückwärtskompatibilität.
In jedem Fall, wie die
List
wird gebaut, ohne eineClass<T>
es gibt keinen Weg für die Umsetzung zu konstruieren, die ein array vom TypT
.T[] natürlich. Downvoter bitte erklären.
du meinst return-Typ T[]? bekommst du eine classcastexception-Fehler, wenn Sie versuchen, es zu verwenden, da die Methode noch erstellt ein Object[]
beim ändern einer Methodensignatur ist es üblich, ändern Sie die Implementierung zu entsprechen. Aber siehe mein edit.
mein Einwand ist, dass alle Signaturen in der Java-api konnte ändern (z.B. alle collection-Klassen, Methoden, etc.) für Generika. also Ihre Behauptung, dass Sie es nicht ändern können, weil es verwendet zu sein so ist das nicht wahr. plus T[] ist Unterklasse von Object[], es wird also keine "break" - code, der erwartet, Object [], wenn Sie es geändert T[]
InformationsquelleAutor user207421
Problemumgehung zu verwenden:
Diese gebunden zu werfen : incompatible types: Object [] " kann nicht in eine Zeichenfolge konvertiert werden[] Fehler
InformationsquelleAutor Ajay Vijayasarathy