En savoir plus sur PECS

Bonjour à tous. Aujourd'hui, je veux parler du principe PECS. Je comprends que maintenant les gourous de la programmation et les seniors expérimentés se sont à nouveau pressés la main, car "Java Generics est apparu dans JDK 1.5, sorti le 30 septembre 2004 ...". Mais s'il y a ceux pour qui le principe PECS reste vague et incompréhensible, et la persistance de googler ne fait qu'épaissir le "brouillard", bienvenue au chat, nous le trierons ensemble jusqu'à la pleine illumination spirituelle. Je tiens à vous avertir tout de suite que cet article ne couvre pas ce que sont les génériques et ce qu'est un joker. Si vous n'êtes pas familier avec ces concepts, vous devez les comprendre avant de les lire.





À première vue, il semble que le principe PECS soit assez simple. Tous ceux qui l'ont rencontré savent qu'il s'agit d'un acronyme pour Producer Extends Consumer Super. Comme expliqué dans de nombreux articles, si nous avons une collection tapée par un caractère générique avec une limite supérieure ( étend ), alors c'est le "producteur". "Il" produit "seulement, fournit l'élément du conteneur et ne reçoit rien par lui-même." Si nous avons une collection tapée par un caractère générique sur la limite inférieure ( super ), alors c'est un «consommateur» qui «n'accepte que, mais ne peut rien fournir».





Eh bien, c'est en fait tout. Maintenant, nous maîtrisons la «magie noire» de PECS et pouvons nous rendre en toute sécurité à une interview sur Google pour impressionner les intervieweurs par notre sagesse et notre expérience. Il ne reste plus qu'une petite formalité, pour lancer votre IDE préféré et vous assurer que tout est en ordre pour le show: les conteneurs délimités par la bordure supérieure ne peuvent fournir que des objets, et les conteneurs limités par la bordure inférieure ne sont que des consommateurs.





Pour plus de clarté, disons que nous avons une hiérarchie de classes commençant par Class0, qui est l'ancêtre de Class1, qui à son tour est l'ancêtre de Class2, et ainsi de suite. Et il existe une méthode qui prend une collection typée par joker avec une limite supérieure comme argument.





someMethod (List<? extends Class3> list)
      
      



Selon le principe PECS, nous ne pouvons rien mettre dans cette fiche, ce ne sera que le fournisseur de données.





List<? extends Class3> list



?





: , list, Class3, , list Class4, Class5, Class6 .. , – « »! :





public static void someMethod (List<? extends Class3> list) {    
	Class4 class4 = list.get(0); 
}
      
      



:





public static void someMethod (List<? extends Class3> list) {
    Class2 class2 = list.get(0);
}
      
      



: .





? ? - , , -. , . , . , Class3.





Class4 class4 = list.get(0);
      
      



- , -, Java . , , , , .





Class4 class4 = (Class4) list.get(0);
      
      



. ? ?





List<? extends Class3> list



(Class0, Class1, Class2), , : - -.  List<Integer> list



, Number,



. , List<? extends Class3> list



Class4 Class5? ! JVM , List<? extends Class3>



. List<Class4>



, List<Class100500>



. List<Class100500>



, , Class3 Class4, , Number



List<Integer>



. , ,  List<? extends Class3>



Class3, - Class3, , , Class3.





PECS – «consumer super» («wildcard superconsumer, , »).





: wildcard super , wildcard extend – ? . List<? extends Class3>



- «» , List<? super Class3>



, «» Class3. ,





public static void someMethod (List<? super Class3> list) {
    list.add(new Class4());
}
      
      



, :





public static void someMethod (List<? super Class3> list) {
    list.add(new Class2());
}
      
      



, :





public static void someMethod (List<Integer> list) {
    list.add(new Number());
}
      
      



, , «wildcard superconsumer » - . , , , «consumer super…»





public static void someMethod (List<? super Class3> list) {
    list.get(0);
}
      
      



, -…





IDE, : , super, consumer! , , list.get(0)



. ? , Class3? ! , Class2 ( - super). ! Class4? . get()



, - ? «» Java - Object.





, PECS: , wildecard , Object?





, , , , , . , wildcard , , -, -.





«» ( Class2 Class3)





public static void someMethod (List<? super Class3> list) {
    Class2 obj = list.get(0);
}
      
      



: List<Class1>



List<Object>



( <? super Class3>



) - (Class2 obj) (list.get(0)



). – , , Java, Object.





C'est tout ce que je voudrais vous dire sur le principe PECS. J'espère que mon explication est claire et aidera ceux qui souffrent de la vérité à comprendre ce problème.








All Articles