"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:"
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:
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."
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);
}
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."
class Zoo<T>
{
ArrayList<T> pets = new ArrayList<T>();
public T createAnimal()
{
T animal = new T();
pets.add(animal)
return animal;
}
}
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:
class Zoo<T extends Cat>
{
T cat;
T getCat()
{
return cat;
}
void setCat (T cat)
{
this.cat = cat;
}
String getCatName()
{
return this.cat.getName();
}
}
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."
GO TO FULL VERSION