Menurut buku "Effective Java" karya Joshua Bloch ada aturan tentang bagaimana/kapan menggunakan wildcard yang dibatasi dalam obat generik. Aturan ini adalah PECS (Producer-Extends, Comsumer-Super). Ketika saya mempelajari contoh berikut:
Stack<Number> numberStack = new Stack<Number>();
Iterable<Integer> integers = ... ;
numberStack.pushAll(integers);
Saya memahami bahwa aturan ini sangat cocok dengan contoh ini. Saya harus mendeklarasikan metode pushAll
seperti contoh berikut:
// Wildcard type for parameter that serves as an E producer
public void pushAll(Iterable<? extends E> src) {
for (E e : src)
{
push(e);
}
}
Tapi apa jadinya jika saya punya contoh berikut?
Stack<Integer> integerStack = new Stack<Integer>();
Iterable<Number> numbers = ... ;
integerStack.pushAll(numbers);
Saya harus mendeklarasikan pushAll
sebagai berikut:
public void pushAll(Iterable<? super E> src) {
for (E e : src)
{
push(e);
}
}
Menurut aturan PECS pernyataan di atas salah. Tapi saya ingin memiliki Stack
dari Integer
s dan meneruskan ke Stack
a Number
ini. Mengapa tidak melakukannya?
Mengapa saya harus selalu menggunakan kata kunci extends
? Mengapa penggunaan super
salah?
Tentu saja hal yang sama berlaku untuk sudut pandang komsumen. Mengapa konsumen harus selalu super
?
PS: Untuk lebih spesifiknya Anda dapat menemukan contoh di atas pada sektor "Item 28" dari buku yang dirujuk.