Heim > Java > javaLernprogramm > Hauptteil

Warum kann ich in Java kein Array generischer Listen deklarieren?

Susan Sarandon
Freigeben: 2024-11-03 13:05:03
Original
771 Leute haben es durchsucht

Why Can't I Declare an Array of Generic Lists in Java?

Unvollständige Löschung in generischen Arrays

Generische Arrays stellen in Java aufgrund des Konzepts der Typlöschung eine einzigartige Herausforderung dar. Dieser Artikel untersucht die Unterschiede zwischen zwei scheinbar ähnlichen Codefragmenten und beleuchtet die zugrunde liegenden Gründe für das Verhalten des Compilers.

Syntax und Semantik

Betrachten Sie den folgenden Code:

<code class="java">ArrayList<Key> a = new ArrayList<Key>();</code>
Nach dem Login kopieren

Dieser Code lässt sich problemlos kompilieren, da er eine Instanz einer generischen ArrayList erstellt. Der folgende Code führt jedoch zu einem Kompilierungsfehler:

<code class="java">ArrayList<Key>[] a = new ArrayList<Key>[10];</code>
Nach dem Login kopieren

Unveiling Type Erasure

Um die Diskrepanz zu verstehen, müssen wir uns mit dem Konzept der Typlöschung befassen. Während der Kompilierung werden die generischen Typinformationen gelöscht, was bedeutet, dass zur Laufzeit nur der Rohtyp (in diesem Fall ArrayList) verfügbar ist.

Roharrays vs. typspezifische Listen

Ein Array erfordert einen Rohtyp, während das erste Codefragment einen Verweis auf eine generische Liste (ArrayList) ohne zusätzliche Typinformationen erstellt. Daher hat der Compiler kein Problem damit, den Typ aufzulösen.

Das zweite Codefragment versucht jedoch, ein Array von Verweisen auf generische Listen zu erstellen. Dies verstößt gegen die Typsicherheitsregeln, da Arrays keine parametrischen Typen sind und keine Typvariablen oder parametrisierten Typen akzeptieren können.

Eine Typecast-Lösung

Um diese Einschränkung zu umgehen, können wir das Array wie folgt typisieren:

<code class="java">ArrayList<Key>[] a = (ArrayList<Key>[]) new ArrayList[10];</code>
Nach dem Login kopieren

Durch die explizite Angabe der generischen Typinformationen im Cast informieren wir den Compiler über den beabsichtigten Typ der Array-Elemente. Dies erfüllt die Typsicherheitsanforderungen des Compilers.

List of Lists (LL)-Ansatz

Alternativ können wir eine Liste von Listen verwenden:

<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>
Nach dem Login kopieren

Dies ist legal, weil ArrayList ist kein Array. Jedes Element in der äußeren ArrayList ist eine ArrayList, bei der es sich um einen vollständig instanziierten Typ handelt.

Typsicherheit und Begründung

Die Einschränkungen des Compilers für generische Arrays dienen der Durchsetzung der Typsicherheit. Ohne diese Prüfungen wäre es leicht, subtile Laufzeitfehler einzuführen, indem Listen verschiedener Typen einem Array generischer Listen zugewiesen werden.

Wenn wir den Grund für das Verhalten des Compilers verstehen, können wir fundierte Entscheidungen darüber treffen, wann und wie um generische Arrays und Listen von Listen zu verwenden, um sowohl die Korrektheit des Codes als auch die Wartbarkeit sicherzustellen.

Das obige ist der detaillierte Inhalt vonWarum kann ich in Java kein Array generischer Listen deklarieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage