编程知识 cdmana.com

[Java Basics] comprendre les génériques

「C'est ma participation11Le défi du mois de juin6Oh, mon Dieu.,Voir les détails de l'événement:2021Un dernier défi

Quels sont les génériques?

JavaGénéralités( generics) - Oui.JDK 5Introduction⼊De⼀Nouvelles fonctionnalités;

InDéfinitionCatégorie、Interface、Utiliser le paramètre de type pour la méthode,InRemplacer lorsqu'il est utiliséDans un type spécifique;

Les génériques sont largement utilisés dans les cadres de classe set;

Les avantages:

La vérification du type de paramètre peut être effectuée avant la compilation;

Peut améliorer la réutilisabilité du Code,Par ListExemple d'interface

Besoin de stockage StringEt IntegerDe List,Non.⽤Généralités, StockageStringType à écrire⼀- Oui.ListInterface, StockageIntegerIl faut écrire autre chose.⼀- Oui.ListInterface, Les génériques peuvent très bien résoudre ce problème.

Les génériques dans le Code

Classe générique

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Copier le Code

Interface générique

public interface List<E> extends Collection<E>
Copier le Code

Approche générique

public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}
Copier le Code

Types de paramètres et signification des génériques

Type de paramètre générique Sens
E-Element Appliquer à la collection , Substituant de type comme élément
T - Type Java Substituant de type pour le paramètre de classe
K - Key & V - Value M ap Substituant de type clé
Indique une incertitudejavaType( Type de Joker illimité )
Object Le type de paramètre est la classe racine de toutes les classes
<? extends T> Qualificatif wildcard,Le type doit êtreTType ouTSous - catégories
<? super T> Qualificatif wildcard,Le type doit êtreTType ouTParent de

Effacement générique

JavaCompilateur Mappe plusieurs instances génériques de la classe à une représentation Bytecode unique , C'est - à - dire l'effacement de type (type erasue).

Exemple

List Et List Type égal Après compilationSont devenus List(Effacement générique).JVM L'objet d'instance de classe obtenu est le même ListObjet.

List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
System.out.println(list1.getClass() == list2.getClass());// true
Copier le Code

La vérification de type générique avant compilation peut être contournée par réflexion

List<Integer> list = new ArrayList<>();
list.add(123);
try {
    // Parce queList Le paramètre générique dans n'a pas de limite supérieure définie ,Alors...addÇa marche.addN'importe quoiObject Paramètre de sous - type pour 
    Method method = list.getClass().getDeclaredMethod("add", Object.class);
    method.invoke(list, "string");
    method.invoke(list, true);
    method.invoke(list, 12.3);
    list.forEach(e -> System.out.println("e = " + e));
} catch (Exception e) {
    e.printStackTrace();
}
--------------------------------------------------------
true
e = 123
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
	at java.util.ArrayList.forEach(ArrayList.java:1257)
	at reflection.Main.main(Main.java:29)
Copier le Code

Lorsque le générique rencontre une surcharge

Erreur de compilation, Parce qu'après l'effacement générique , Les signatures des paramètres sont les mêmes pour les deux méthodes .

版权声明
本文为[Sa guitare en bois]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/11/20211125174842995z.html

Scroll to Top