Halo semuanya. Hari ini saya ingin berbicara tentang prinsip PECS. Saya mengerti bahwa sekarang ahli pemrograman dan senior berpengalaman sekali lagi menempelkan tangan mereka di wajah, karena "Java Generics muncul di JDK 1.5, yang dirilis pada 30 September 2004 ...". Tetapi jika ada orang-orang yang prinsip PECS tetap kabur dan tidak dapat dipahami, dan googling yang gigih hanya mempertebal "kabut", selamat datang di kucing, kami akan memilahnya bersama-sama hingga pencerahan spiritual penuh. Saya ingin memperingatkan Anda segera bahwa artikel ini tidak membahas apa itu generik dan apa itu wildcard. Jika Anda tidak terbiasa dengan konsep-konsep ini, maka Anda perlu memahaminya sebelum membaca.
Sekilas, prinsip PECS terlihat cukup sederhana. Setiap orang yang pernah bertemu dengannya tahu bahwa ini adalah singkatan dari Producer Extends Consumer Super. Seperti yang dijelaskan di banyak artikel, jika kita memiliki koleksi yang diketik oleh wildcard dengan batas atas ( meluas ), maka ini adalah "produser". "Itu hanya 'menghasilkan', menyediakan elemen dari wadah, dan tidak menerima apa pun dengan sendirinya." Jika kita memiliki koleksi yang diketik oleh wildcard di batas bawah ( super ), maka ini adalah “konsumen” yang “hanya menerima, tetapi tidak dapat memberikan apa-apa”.
Sebenarnya itu saja. Sekarang kami telah menguasai "sihir gelap" PECS dan dapat dengan aman pergi ke wawancara di Google untuk mengesankan pewawancara dengan kebijaksanaan dan pengalaman kami. Hanya ada satu formalitas kecil yang tersisa, untuk meluncurkan IDE favorit Anda dan memastikan bahwa semuanya sesuai untuk pertunjukan: wadah yang dibatasi oleh batas atas hanya dapat menyediakan objek, dan wadah yang dibatasi oleh batas bawah hanyalah konsumen.
Untuk kejelasan, katakanlah kita memiliki hierarki kelas yang dimulai dengan Kelas0, yang merupakan leluhur Kelas1, yang pada gilirannya merupakan leluhur Kelas2, dan seterusnya. Dan ada metode yang menggunakan koleksi tipe wildcard dengan batas atas sebagai argumen.
someMethod (List<? extends Class3> list)
Sesuai prinsip PECS, kami tidak bisa memasukkan apapun ke dalam sheet ini, hanya akan menjadi penyedia data.
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.
Sekian yang ingin saya sampaikan tentang prinsip PECS. Saya berharap penjelasan saya keluar dengan jelas dan akan membantu mereka yang menderita kebenaran untuk memahami masalah ini.