"Hai, Amigo!"

"Halo, Ellie!"

"Dina iki, aku lan Rishi arep ngandhani kabeh babagan generik."

"Enteni, aku rumangsa wis ngerti meh kabeh."

"Meh kabeh, nanging ora kabeh."

"Tenan? OK, aku siyap ngrungokake."

"Banjur ayo miwiti."

"Ing Jawa, generik minangka kelas sing duwe parameter jinis."

"Minangka generik diciptakake, deleng komentar ing kode:"

Tuladha
ArrayList stringList = new ArrayList();
stringList.add("abc"); // Add a string to the list
stringList.add("abc"); // Add a string to the list
stringList.add( 1 ); // Add a number to the list

for(Object o: stringList)
{
 String s = (String) o; // There will be an exception here when we get to the integer
}

Cara ngatasi masalah nggunakake Generics:

Tuladha
ArrayList<String> stringList = new ArrayList<String>();
stringList.add("abc"); // Add a string to the list
stringList.add("abc"); // Add a string to the list
stringList.add( 1 ); // There will be a compilation error here

for(Object o: stringList)
{
 String s = (String) o;
}

"Kode iki mung ora bakal dikompilasi, lan kesalahan sing disebabake nambahake jinis data sing salah bakal katon nalika kompilasi."

"Iya, aku wis ngerti iki."

"Oke, apik. Ambalan minangka ibu sinau."

"Nanging pangripta Jawa rada kesed nalika nggawe generik. Tinimbang nggawe jinis lengkap kanthi paramèter, padha mlebu ing optimasi sing apik. Ing kasunyatan, dheweke ora nambah informasi babagan parameter jinis menyang generik. Nanging, kabeh sihir dumadi nalika kompilasi."

Kode karo generik
List<String> strings = new ArrayList<String>();
strings.add("abc");
strings.add("abc");
strings.add( 1); // Compilation error

for(String s: strings)
{
 System.out.println(s);
}
Apa pancene kedadeyan
List strings = new ArrayList();

strings.add((String)"abc");
strings.add((String)"abc");
strings.add((String) 1); // Compilation error

for(String s: strings)
{
 System.out.println(s);
}

"Iku lunyu."

"Ya, nanging pendekatan iki duwe efek samping.  Ora ana informasi babagan parameter jinis sing disimpen ing kelas umum.  Pendekatan iki banjur dikenal minangka erasure tipe ."

"Ing tembung liyane, yen sampeyan duwe kelas dhewe karo paramèter jinis, sampeyan ora bisa nggunakake informasi bab mau nang kelas."

Kode karo generik
class Zoo<T>
{
 ArrayList<T> pets = new ArrayList<T>();

 public T createAnimal()
 {
  T animal = new T();
  pets.add(animal)
  return animal;
 }
}
Apa pancene kedadeyan
class Zoo
{
 ArrayList pets = new ArrayList();

 public Object createAnimal()
 {
  Object animal = new ???();
  pets.add(animal)
  return animal;
 }
}

"Sajrone kompilasi, kabeh jinis parameter diganti karo Obyek. Lan ing kelas ora ana informasi babagan jinis sing diterusake."

"Ya, aku setuju, sing ora paling apik."

"Ora medeni, mengko dakkandhani carane ngatasi masalah iki."

Nanging ana liyane. Jawa ngidini sampeyan nemtokake jinis induk kanggo paramèter jinis. Tembung kunci extends digunakake kanggo iki. Tuladhane:

Kode karo generik
class Zoo<T extends Cat>
{
 T cat;

 T getCat()
 {
  return cat;
 }

 void setCat (T cat)
 {
  this.cat = cat;
 }

 String getCatName()
 {
  return this.cat.getName();
 }
}
Apa pancene kedadeyan
class Zoo
{
 Cat cat;

 Cat getCat()
 {
  return cat;
 }

 void setCat(Cat cat)
 {
  this.cat = cat;
 }

 String getCatName()
 {
  return this.cat.getName();
 }
}

"Elinga rong fakta:"

"Kaping pisanan, sampeyan ora bisa ngliwati sembarang jinis minangka parameter - sampeyan mung bisa ngliwati Kucing utawa kelas sing marisi Kucing."

"Kapindho, ing jero kelas Zoo, variabel jinis T saiki bisa nelpon metode kelas Cat.  Kolom ing sisih tengen nerangake sebabe (amarga Kucing bakal diganti ing endi wae ana T)"

"Ya. Yen kita ngomong yen Cat utawa subclass saka Cat dilewati minangka argumen tipe, mula kita yakin yen jinis T bakal tansah duwe metode kelas Cat."

"Wah, pinter kuwi."