"Hai! Saya akan sambung pelajaran Ellie tentang generik. Sedia untuk mendengar?"

"Ya."

"Kalau begitu mari kita mulakan."

"Perkara pertama yang anda perlu tahu ialah kaedah kelas juga boleh mempunyai parameter jenisnya sendiri."

"Saya tahu."

"Tidak, saya secara khusus maksudkan parameter jenis mereka sendiri: "

Contoh
class Calculator
{
  T add(T a, T b); // Add
  T sub(T a, T b); // Subtract
  T mul(T a, T b); // Multiply
  T div(T a, T b); // Divide
}

"Parameter jenis ini berkaitan secara khusus dengan kaedah. Kelas tidak mempunyai parameter. Anda juga boleh mengisytiharkan kaedah ini statik dan memanggilnya tanpa objek."

"Saya faham. Titik parameter jenis dalam kaedah adalah sama dengan kelas?"

"Ya. Tapi ada yang baru."

"Seperti yang anda sedia maklum, anda boleh menggunakan kad bebas dalam pengisytiharan jenis. Kemudian bayangkan situasi berikut:"

Contoh 1
public void doSomething(List<? extends MyClass> list)
{
 for(MyClass object : list)
 {
  System.out.println(object.getState()); // Everything works well here.
 }
}

"Tetapi bagaimana jika kami mahu menambah item baharu pada koleksi:"

Contoh 2
public void doSomething(List<? extends MyClass> list)
{
 list.add(new MyClass()); // Error!
}

"Masalahnya ialah dalam kes umum kaedah doSomething mungkin diluluskan Senarai yang elemennya bukan objek MyClass, sebaliknya objek bagi mana-mana subkelas MyClass. Tetapi anda tidak boleh menambah objek MyClass pada senarai sedemikian!"

"Ah. Jadi, apa yang boleh dilakukan tentang itu?"

"Tiada apa-apa. Dalam situasi ini, anda tidak boleh berbuat apa-apa. Tetapi ini memberi pencipta Java sesuatu untuk difikirkan. Dan mereka menghasilkan kata kunci baharu: super ."

"Sintaks kelihatan hampir sama:"

List<? super MyClass> list

Tetapi terdapat perbezaan penting antara lanjutan dan super.

"«? memanjangkan T» bermakna kelas itu mestilah keturunan T."

"«? super T» bermakna kelas itu mestilah nenek moyang T."

"Holy moly. Jadi di mana ini digunakan?"

"«? super T» digunakan apabila kaedah melibatkan penambahan pada koleksi objek T. Dalam kes ini, ia boleh menjadi koleksi objek T atau mana-mana nenek moyang T."

"Ah. Objek AT boleh diberikan kepada pembolehubah rujukan yang jenisnya ialah mana-mana nenek moyang T"

"Sejujurnya, pendekatan ini tidak begitu kerap digunakan. Apatah lagi, ia mempunyai kekurangan. Contohnya:"

Contoh
public void doSomething(List<? super MyClass> list)
{
 for(MyClass object : list) // Error!
 {
  System.out.println(object.getState());
 }
}
public void doSomething(List<? super MyClass> list)
{
 list.add(new MyClass()); // Everything works well here.
}

"Sekarang contoh pertama tidak berfungsi."

"Memandangkan senarai juga boleh menjadi Senarai<Object> (Objek ialah kelas super teratas MyClass), kami pada dasarnya menulis kod tidak sah berikut:"

Contoh 1
List<Object> list;

for(MyClass object : list) // Error!
{
 System.out.println(object.getState());
}

"Saya faham. Terima kasih atas pengajaran yang menarik."

"Sama-sama."