「C'est ma participation11Le défi du mois de juin6Oh, mon Dieu.,Voir les détails de l'événement:2021Un dernier défi」
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.
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
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 |
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 .