Maison  >  Article  >  Java  >  Comment utiliser la collection de conteneurs génériques Java

Comment utiliser la collection de conteneurs génériques Java

WBOY
WBOYavant
2023-04-19 18:10:42758parcourir

Commençons par un exemple simple :

<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>

Cet exemple est en fait un peu anti-humain. On estime que la première réaction de la plupart des gens (moi y compris) face à ce genre de conversion doit être "bien sûr que c'est vrai" ( c'est un piège), dites Voici ma compréhension :

  • Collection : indique que cette collection contient tous les objets de type Number, qui peuvent être Integer/Long/Float, car le compilateur peut déterminer cette instance obj de Number == true;

  • Collection : indique que cette collection est une instance de collection d'"un sous-type" du type Number, qui peut être Collection/Collection, appelant donc number2.add( 1) ne fonctionnera pas à cause de la compilation. Le compilateur ne sait pas à quel sous-type de Number est l'élément contenu dans Numbers2, et le compilateur ne peut pas déterminer le résultat de l'instance obj de UnknownType ;

  • Collection, ce type E est " un "type spécifique, pas une représentation Espaces réservés pour plusieurs sous-types d'un parent ;

Un autre exemple :

<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 hérite clairement du nombre, alors pourquoi

  • Collection == Collection

n'est pas vrai Eh bien, regardons un autre exemple :

<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>

Si la ligne 1 est établie, alors le prochain profit sera un nombre négatif, et une série de calculs ultérieurs sembleront anormaux. Si le code n'est pas assez robuste, cela semblera anormal. peut même lancer une RuntimeException inattendue, provoquant la fin anormale de la méthode ou même le crash du programme.

Donc, en une phrase, Collection != Collection est destiné à la sécurité d'exécution, et les éventuelles exceptions de conversion de type seront résolues au moment de la compilation.

Parlons maintenant de Collection et Collection. La première réaction de nombreuses personnes (moi y compris) doit être « Object est la classe parent commune de tous les objets Java, donc Collection . Collection de type ", regardons un exemple :

<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 représente une plage plus grande que Collection;

  • ne peut pas appeler object2.add(1) car le compilateur ne peut pas le faire avec précision. déduire Le type de données des objets conteneurs2 peut provoquer une exception de conversion de type d'exécution ;

  • La manière correcte d'écrire une collection de n'importe quel type de données est Collection;

  • Collection de types.

    Pourquoi Collection ne représente une collection d'aucun type ? En fait, le compilateur pense qu'il y a un risque d'erreurs de conversion de type :

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