2016-03-21 4 views
-1

Getestet habe ich diesen Code:Warum muss in Integer [] konvertiert werden, aber Collection <Object> nicht?

Collection l = new ArrayList<Object>(); 
    l.add(5); 
    l.add(2); 
    l.add(6); 

    Integer[] a=l.toArray(new Integer[0]);//this requires casting to Integer[] 

und auch einen Blick auf diesen Code:

Collection<Object> l = new ArrayList<Object>(); 
    l.add(5); 
    l.add(2); 
    l.add(6); 

    Integer[] a=l.toArray(new Integer[0]);//this doesn't require casting to Integer[] 

erste Frage ist

Warum aber hat Gießen erste erfordert zweite nicht?

zweite Frage ist

die Größe des Arrays keine Rolle Rolle, warum wir gehen nicht nur Klassennamen oder andere Art und Weise? Was ist der Grund, api wie dies für eine?

+0

aber Frage ist difference.this spesific zu Collection.because Gießen ist auf den ersten Code erfordert auf den zweiten aber nicht – Sarkhan

+0

Dies geschieht, weil Sie eine rohe Art verwenden. Verwenden Sie keine Rohtypen. Problem gelöst. – Radiodef

+0

@Serkhan Vielen Dank für die Annahme meiner Antwort. Ich habe es seitdem modifiziert, um die Besetzung zu erklären. Radiodef hat allerdings Recht - Sie müssen sich darüber nicht wirklich sorgen. –

Antwort

1

Die erste Frage bezieht sich auf this question. Generische Typen wurden erst mit Java 5 in die Sprache eingeführt, so dass rohe Typen zur Kompatibilität mit früherem Code zugelassen wurden. Raw-Typen funktionieren einfach, indem sie alle generischen Typinformationen in den Methodensignaturen und Rückgabetypen ignorieren. Aus diesem Grund, wenn Sie eine rohe Art verwenden, wird der Rückgabetyp von toArray betrachtet Object[] statt T[] zu sein. Deshalb ist eine Besetzung erforderlich.

Die Prämisse der zweiten Frage ist fehlerhaft. Die Größe des Arrays tut Angelegenheit, weil, wenn das Array groß genug ist, um alle Elemente der Sammlung zu halten, ist die tatsächliche Array wird an gefüllt werden. Nur wenn das übergebene Array zu klein ist, wird ein neues Array desselben Typs erstellt.

Sie sind richtig, dass es für das Argument von toArray möglich gewesen, haben Art zu haben Class<T> statt T[], aber die wirkliche Version hat den Vorteil, dass es Arrays ermöglicht wiederverwendet werden.

+0

Ich möchte sie die ' T [] toArray (Klasse )' Überlastung zur Verfügung gestellt. Und in Java 8 sie die ' T [] toArray (IntFunction ) zur Verfügung gestellt haben könnten' Überlastung, aber sie taten es nicht für gut, ich habe keine Ahnung, warum nicht. Sie haben andere Schnittstellen in Java 8 hinzugefügt. – Radiodef

+1

@Radiodef Ich stimme zu. 'toArray' ist total durcheinander. –

Verwandte Themen