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.
Betrachten Sie den folgenden Code:
<code class="java">ArrayList<Key> a = new ArrayList<Key>();</code>
Dieser Code lässt sich problemlos kompilieren, da er eine Instanz einer generischen ArrayList
<code class="java">ArrayList<Key>[] a = new ArrayList<Key>[10];</code>
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.
Ein Array erfordert einen Rohtyp, während das erste Codefragment einen Verweis auf eine generische Liste (ArrayList
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.
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>
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.
Alternativ können wir eine Liste von Listen verwenden:
<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>
Dies ist legal, weil ArrayList ist kein Array. Jedes Element in der äußeren ArrayList ist eine ArrayList
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!