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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBavant
2023-04-19 18:10:42830parcourir

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>
    • Collection parce que Object C'est la classe parent de tous les objets et un type connu. Il peut être jugé par obj instanceof Object ;

    • Collection ne peut pas mettre de données dans le conteneur car ? le résultat de l'instance obj de UnknownType ne peut pas être jugé ;

    •  ? Il représente un type inconnu et Object représente un type connu ;

    • Si Collection représente n'importe quel type, selon la loi de Murphy (ce qui peut arriver arrivera certainement), alors le crash dans l'exemple ci-dessus est inévitable. va arriver. . (Un autre problème en ligne)

      Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

      Déclaration:
      Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer