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
Collection extends Number> : indique que cette collection est une instance de collection d'"un sous-type" du type Number, qui peut être Collection
Collection
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
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
Parlons maintenant de Collection
<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
Pourquoi Collection
<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
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
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!