"Hai! Aku akan melanjutkan pelajaran Ellie tentang obat generik. Siap mendengarkan?"

"Ya."

"Kalau begitu mari kita mulai."

"Hal pertama yang perlu Anda ketahui adalah bahwa metode kelas juga dapat memiliki parameter tipenya sendiri."

"Aku tahu."

"Tidak, maksud saya secara khusus parameter tipe 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 berhubungan khusus dengan metode. Kelas tidak memiliki parameter. Anda bahkan dapat mendeklarasikan metode ini statis dan memanggilnya tanpa objek."

"Begitu. Inti dari parameter tipe dalam metode sama dengan untuk kelas?"

"Ya. Tapi ada yang baru."

"Seperti yang sudah Anda ketahui, Anda bisa menggunakan wildcard dalam deklarasi tipe. Lalu 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.
 }
}

"Tapi bagaimana jika kita ingin menambahkan item baru ke dalam koleksi:"

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

"Masalahnya adalah bahwa dalam kasus umum metode doSomething dapat dilewatkan Daftar yang elemennya bukan objek MyClass, melainkan objek dari setiap subclass dari MyClass. Tetapi Anda tidak dapat menambahkan objek MyClass ke daftar seperti itu!"

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

"Tidak ada. Dalam situasi ini, Anda tidak dapat melakukan apa-apa. Tapi ini memberi pencipta Java sesuatu untuk dipikirkan. Dan mereka menemukan kata kunci baru: super ."

"Sintaksnya terlihat hampir sama:"

List<? super MyClass> list

Tapi ada perbedaan penting antara extends dan super.

"«? extends T» berarti kelas tersebut harus merupakan turunan dari T."

"«? super T» artinya kelas tersebut harus merupakan nenek moyang dari T."

"Holy moly. Jadi di mana ini digunakan?"

"«? super T» digunakan ketika suatu metode melibatkan penambahan ke kumpulan objek T. Dalam hal ini, itu bisa berupa kumpulan objek T atau leluhur dari T."

"Ah. Objek AT dapat ditugaskan ke variabel referensi yang tipenya adalah salah satu leluhur T"

"Sejujurnya, pendekatan ini tidak terlalu sering digunakan. Apalagi ada kekurangannya. Misalnya:"

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 berhasil."

"Karena list bahkan bisa berupa List<Object> (Object adalah superclass teratas MyClass), kami pada dasarnya menulis kode tidak valid berikut:"

Contoh 1
List<Object> list;

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

"Begitu. Terima kasih untuk pelajaran yang menarik."

"Terima kasih kembali."