33 Stimmen

Casting eines Arrays von Objects in ein Array der von mir gewünschten Klasse

Nur für die Überprüfung, kann jemand schnell erklären, was verhindert, dass dies funktioniert (auf Compile):

private HashSet data;

...

public DataObject[] getDataObjects( )
{
    return (DataObject[]) data.toArray();
}

...und warum das so ist, dass es funktioniert:

public DataObject[] getDataObjects( )
{
    return (DataObject[]) data.toArray( new DataObject[ Data.size() ] );
}

Ich bin mir nicht im Klaren darüber, welcher Mechanismus beim Gießen (oder was auch immer es ist) dies bewirkt.

40voto

Paul Tomblin Punkte 172816

Denn toArray() erzeugt ein Array von Object, und Sie können nicht Object[] in DataObject[] einfach durch den Wurf. toArray(DataObject[]) erstellt ein Array von DataObject .

Und ja, es ist ein Manko der Collections-Klasse und der Art und Weise, wie Generics in Java hineingepflanzt wurden. Sie würden erwarten, dass Collection<E>.toArray() könnte ein Array von E zurückgeben, tut es aber nicht.

Interessant ist die Tatsache, dass die toArray(DataObject[]) Aufruf: Sie müssen das Array "a" nicht groß genug machen, so dass Sie es mit toArray(new DataObject[0]) wenn Sie mögen.

Es zu nennen wie toArray(new DateObject[0]) ist eigentlich besser, wenn Sie die .length Wenn die ursprüngliche Länge groß war und das gleiche Array-Objekt, das Sie übergeben haben, zurückgegeben wurde, müssen Sie möglicherweise NullPointerException s später

Ich habe vorhin eine Frage zu Java Generics gestellt und wurde auf diese FAQ verwiesen, die sehr hilfreich war: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

3voto

Henning Punkte 15543

Um die Typsicherheit beim Casting eines Arrays zu gewährleisten, wie Sie es beabsichtigt haben ( DataObject[] dataArray = (DataObject[]) objectArray; ), müsste die JVM jedes einzelne Objekt im Array untersuchen, so dass es sich nicht um eine einfache Operation wie eine Typumwandlung handelt. Ich denke, das ist der Grund, warum Sie die Array-Instanz übergeben müssen, die die toArray() Operation füllt sich dann.

3voto

Vikas Tawniya Punkte 1125

Nach Java 8 mit der Einführung von Streams und Lambda können Sie auch die folgenden Dinge tun:

Für das Casting eines normalen Arrays von Objekten

Stream.of(dataArray).toArray(DataObject[]::new);

Für das Werfen einer Liste

dataList.stream().toArray(DataObject[]::new);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X