"Hi, Amigo!"

"Hi, Ellie!"

"Ngayon, sasabihin namin ni Rishi sa iyo ang lahat tungkol sa generics."

"Teka, parang alam ko na halos lahat."

"Halos lahat, pero hindi lahat."

"Talaga? OK, handa akong makinig."

"Kung ganoon ay magsimula na tayo."

"Sa Java, ang mga generic ay mga klase na may mga parameter ng uri."

"Kung bakit naimbento ang mga generic, tingnan ang mga komento sa code:"

Halimbawa
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
}

Paano lutasin ang problema gamit ang Generics:

Halimbawa
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;
}

"Ang code na ito ay hindi lang mag-compile, at ang error na dulot ng pagdaragdag ng maling uri ng data ay mapapansin sa panahon ng compilation."

"Oo, alam ko na ito."

"Okay, good. Repetition is the mother of learning."

"Ngunit medyo tamad ang mga tagalikha ng Java noong lumikha sila ng mga generic. Sa halip na gumawa ng mga ganap na uri na may mga parameter, nadulas sila sa isang makinis na pag-optimize. Sa totoo lang, hindi sila nagdagdag ng anumang impormasyon tungkol sa mga parameter ng uri sa mga generic. Sa halip, lahat ng nagaganap ang magic sa panahon ng compilation."

Code na may generics
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);
}
Kung ano talaga ang nangyayari
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);
}

"Iyan ay makinis."

"Oo, ngunit ang diskarteng ito ay may side effect.  Walang impormasyon tungkol sa mga parameter ng uri ang nakaimbak sa loob ng isang generic na klase.  Ang diskarteng ito sa kalaunan ay nakilala bilang type erasure ."

"Sa madaling salita, kung mayroon kang sariling klase na may mga parameter ng uri, hindi mo magagamit ang impormasyon tungkol sa mga ito sa loob ng klase."

Code na may generics
class Zoo<T>
{
 ArrayList<T> pets = new ArrayList<T>();

 public T createAnimal()
 {
  T animal = new T();
  pets.add(animal)
  return animal;
 }
}
Kung ano talaga ang nangyayari
class Zoo
{
 ArrayList pets = new ArrayList();

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

"Sa panahon ng compilation, lahat ng uri ng parameter ay pinapalitan ng Object. At sa loob ng klase ay walang impormasyon tungkol sa uri na ipinasa dito."

"Oo, sumasang-ayon ako, hindi iyon ang pinakamahusay."

"It's not that scary. I'll tell you later how to get around this problem."

Pero meron pa. Hinahayaan ka ng Java na tumukoy ng uri ng magulang para sa mga parameter ng uri. Ginagamit ang extends na keyword para dito. Halimbawa:

Code na may generics
class Zoo<T extends Cat>
{
 T cat;

 T getCat()
 {
  return cat;
 }

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

 String getCatName()
 {
  return this.cat.getName();
 }
}
Kung ano talaga ang nangyayari
class Zoo
{
 Cat cat;

 Cat getCat()
 {
  return cat;
 }

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

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

"Tandaan ang dalawang katotohanan:"

"Una, hindi ka maaaring pumasa sa anumang uri bilang isang parameter — maaari ka lamang pumasa sa isang Cat o isang klase na nagmamana ng Cat."

"Pangalawa, sa loob ng klase ng Zoo, ang mga variable ng uri T ay maaari na ngayong tumawag sa mga pamamaraan ng klase ng Cat.  Ang column sa kanan ay nagpapaliwanag kung bakit (dahil ang Cat ay papalitan kung saan may T)"

"Oo. Kung sasabihin namin na ang Cat o isang subclass ng Cat ay ipinasa bilang ang uri ng argumento, pagkatapos ay sigurado kami na ang uri T ay palaging magkakaroon ng mga pamamaraan ng klase ng Cat."

"Well, matalino yan."