Hallo zusammen. Heute möchte ich über das PECS-Prinzip sprechen. Ich verstehe, dass jetzt Programmiergurus und erfahrene Senioren erneut ihre Hände ins Gesicht gedrückt haben, weil "Java Generics in JDK 1.5 erschienen ist, das am 30. September 2004 veröffentlicht wurde ...". Aber wenn es solche gibt, für die das PECS-Prinzip vage und unverständlich bleibt und anhaltendes Googeln nur den "Nebel" verdickt, willkommen bei der Katze, werden wir es gemeinsam bis zur vollständigen spirituellen Erleuchtung klären. Ich möchte Sie sofort warnen, dass dieser Artikel nicht behandelt, was Generika sind und was ein Platzhalter ist. Wenn Sie mit diesen Konzepten nicht vertraut sind, müssen Sie sie vor dem Lesen verstehen.
Auf den ersten Blick scheint das PECS-Prinzip recht einfach zu sein. Jeder, der ihn getroffen hat, weiß, dass dies eine Abkürzung für Producer Extends Consumer Super ist. Wie in zahlreichen Artikeln erläutert , ist dies der "Produzent" , wenn wir eine Sammlung haben, die durch einen Platzhalter mit einer Obergrenze ( erweitert ) typisiert ist. "Es 'produziert' nur, liefert das Element aus dem Container und empfängt nichts von selbst." Wenn wir eine Sammlung haben, die durch einen Platzhalter an der unteren Grenze ( super ) eingegeben wurde , dann ist dies ein "Verbraucher", der "nur akzeptiert, aber nichts bereitstellen kann".
Nun, das ist eigentlich alles. Jetzt haben wir die "dunkle Magie" von PECS gemeistert und können sicher zu einem Interview bei Google gehen, um die Interviewer mit unserer Weisheit und Erfahrung zu beeindrucken. Es gibt nur noch eine kleine Formalität, um Ihre Lieblings-IDE zu starten und sicherzustellen, dass alles für die Show gilt: Container, die durch den oberen Rand begrenzt sind, können nur Objekte bereitstellen, und Container, die durch den unteren Rand begrenzt sind, sind nur Verbraucher.
Nehmen wir zur Verdeutlichung an, wir haben eine Klassenhierarchie, die mit Class0 beginnt, dem Vorfahren von Class1, der wiederum der Vorfahr von Class2 ist, und so weiter. Und es gibt eine Methode, die eine Sammlung vom Platzhalter mit einer Obergrenze als Argument verwendet.
someMethod (List<? extends Class3> list)
Nach dem PECS-Prinzip können wir nichts in dieses Blatt einfügen, es wird nur der Datenanbieter sein.
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 super — consumer, , »).
: 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 super — consumer » - . , , , «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.
Das ist alles, was ich Ihnen über das PECS-Prinzip erzählen möchte. Ich hoffe, meine Erklärung wurde klar und hilft denen, die unter der Wahrheit leiden, dieses Problem zu verstehen.