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

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

WBOY
Libérer: 2023-04-19 18:10:42
avant
822 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion