Heim  >  Artikel  >  Java  >  So verwenden Sie die generische Java-Containersammlung

So verwenden Sie die generische Java-Containersammlung

WBOY
WBOYnach vorne
2023-04-19 18:10:42758Durchsuche

Beginnen wir mit einem einfachen Beispiel:

<code>public void testGenerics() {<br>    Collection<Number> numbers = new ArrayList<>();<br>    numbers.add(1); // ok<br>    numbers.add(0.1); // ok<br><br>    Collection<? extends Number> numbers2 = new ArrayList<>();<br>    // don't work, you don't know which subtype 'numbers2' exactly contains<br>    numbers2.add(1); // oops!<br>}<br></code>

Dieses Beispiel ist tatsächlich etwas unmenschlich. Es wird geschätzt, dass die erste Reaktion der meisten Menschen (einschließlich mir) auf diese Konvertierung sein muss. Natürlich ist es richtig.“ (Das ist eine Falle), lassen Sie mich Ihnen sagen, was ich verstehe:

  • Collection: Zeigt an, dass diese Collection Objekte des Typs enthält Zahl, die Integer/Long/Float sein kann, da der Compiler feststellen kann, dass obj Instanz von Number == true; sein Collection/Collection, daher funktioniert der Aufruf von „numbers2.add(1)“ nicht, da der Compiler nicht weiß, um welchen Subtyp von „Number“ es sich bei dem in „numbers2“ enthaltenen Element handelt. Kompilierung Der Prozessor kann das Ergebnis der obj-Instanz von „UnknownType“ nicht ermitteln ;

  • Collection, dieser E-Typ ist „ein“ spezifischer Typ, nicht mehrere, die einen übergeordneten Platzhalter für den Seed-Typ darstellen; #

  • Ein weiteres Beispiel:
  • <code>public void testGenerics() {<br>    Collection<Number> numbers = new ArrayList<>();<br>    Collection<Integer> integers = new ArrayList<>();<br>    Collection<? extends Number> numbers2 = new ArrayList<>();<br>    <br>    numbers2 = integers; // ok<br>    numbers2 = numbers; // ok<br>    <br>    // don't work, Collection<Number> != Collection<Integer><br>    numbers = integers; // oops!<br>}<br></code>

    Integer erbt eindeutig Number, also warum

    #🎜 🎜#
Collection == Collection

ist nicht wahr, schauen wir uns ein anderes Beispiel an:
    <code>public void testGenerics() {<br>    Collection<Integer> profits = new ArrayList<>();<br>    <br>    insertSomething(profits); // line 1<br>    <br>    Integer profit = profits.iterator().next(); // oops! crash<br>}<br><br>private void insertSomething(Collection<Number> numbers) {<br>    numbers.add(Long.MAX_VALUE);<br>}<br></code>
  • Wenn Zeile 1 festgelegt ist, wird der nächste Gewinn erzielt Wenn es sich um eine negative Zahl handelt, werden bei einer Reihe nachfolgender Berechnungen Ausnahmen generiert. Wenn der Code nicht robust genug ist, wird möglicherweise sogar eine unerwartete RuntimeException ausgelöst, die dazu führt, dass die Methode abnormal beendet wird.

    In einem Satz: Collection dient der Laufzeitsicherheit und mögliche Ausnahmen bei der Typkonvertierung werden zur Kompilierzeit behoben.
  • Lassen Sie uns nun über Collection und Collection sprechen, und die erste Reaktion vieler Leute (einschließlich mir) muss sein: „

    Object ist die gemeinsame übergeordnete Klasse aller Java Objekte, sodass Collection jede Art von Sammlung darstellen kann

    “, schauen wir uns ein Beispiel an:

    <code>public void testGenerics2() {<br>    Collection<Integer> integers = new ArrayList<>();<br><br>    Collection<?> objects2 = integers; // ok<br>    // don't work, which type of 'objects2' contains is uncertain<br>    objects2.add(1); // oops!<br>    <br>    Collection<Object> objects = integers; // oops!<br>}<br></code>

    Collection stellt eine umfassendere dar Bereich als Collection< ;Object>Large;

    Objects2.add(1) kann nicht aufgerufen werden, da der Compiler nicht genau ableiten kann, um welche Art von Datentyp es sich bei Containerobjekten2 handelt Verursachen Sie eine Ausführungstypkonvertierungsausnahme, wenn 🎜🎜#Collection keinen Sammlungstyp darstellen kann.