"Kumusta, Amigo! Ang paksa ng aralin ngayon ay pagpapalawak at pagpapaliit ng mga uri ng conversion. Matagal mo nang natutunan ang tungkol sa pagpapalawak at pagpapaliit ng mga primitive na uri. Sa Level 10. Ngayon ay pag-uusapan natin kung paano ito gumagana para sa mga uri ng sanggunian, ibig sabihin, mga pagkakataon ng mga klase."

Sa katunayan, ang lahat ay medyo simple. Isipin ang inheritance chain ng isang klase: ang klase, ang magulang nito, ang magulang ng magulang, atbp., pabalik sa klase ng Object. Dahil naglalaman ang isang klase ng lahat ng paraan ng miyembro ng klase na minana nito , maaaring i-save ang isang instance ng klase sa isang variable na ang uri ay ang alinman sa mga magulang nito.

Narito ang isang halimbawa:

Code Paglalarawan
class Animal
{
public void doAnimalActions();
}class Cat extends Animal
{
public void doCatActions();
}class Tiger extends Cat
{
public void doTigerActions();
}
Narito mayroon kaming tatlong deklarasyon ng klase: Hayop, Pusa, at Tigre. Nagmana ng Hayop ang pusa. At ang Tigre ay namamana ng Pusa.
public static void main(String[] args)
{
Tiger tiger = new Tiger();
Cat cat = new Tiger();
Animal animal = new Tiger();
Object obj = new Tiger();
}
Ang isang Tiger object ay palaging maaaring italaga sa isang variable na ang uri ay ang isa sa mga ninuno nito. Para sa klase ng Tiger, ito ay Pusa, Hayop, at Bagay.

Ngayon tingnan natin ang pagpapalawak at pagpapaliit ng mga conversion.

Kung ang isang pagpapatakbo ng pagtatalaga ay nagsasanhi sa amin na umakyat sa kadena ng mana (patungo sa klase ng Bagay), kung gayon kami ay humaharap sa isang lumalawak na conversion (kilala rin bilang upcasting). Kung ibababa natin ang kadena patungo sa uri ng bagay, ito ay isang paliit na conversion (kilala rin bilang downcasting).

Ang pagtaas ng kadena ng mana ay tinatawag na pagpapalawak, dahil humahantong ito sa isang mas pangkalahatang uri. Gayunpaman, sa paggawa nito nawawalan tayo ng kakayahang gamitin ang mga pamamaraang idinagdag sa klase sa pamamagitan ng pamana.

Code Paglalarawan
public static void main(String[] args)
{
Object obj = new Tiger();
Animal animal = (Animal) obj;
Cat cat = (Cat) obj;
Tiger tiger = (Tiger) animal;
Tiger tiger2 = (Tiger) cat;
}
Kapag pinaliit ang uri, kailangan mong gumamit ng operator ng conversion ng uri, ibig sabihin, nagsasagawa kami ng tahasang conversion.

Nagiging sanhi ito ng Java machine upang suriin kung ang object ay talagang nagmamana ng uri na gusto naming i-convert ito.

Ang maliit na inobasyon na ito ay gumawa ng sari-sari na pagbawas sa bilang ng mga error sa uri ng paghahagis, at makabuluhang pinataas ang katatagan ng mga programang Java.

Code Paglalarawan
public static void main(String[] args)
{
Object obj = new Tiger();
if (obj instanceof Cat)
{
Cat cat = (Cat) obj;
cat.doCatActions();
}}
Mas mabuti pa, gumamit ng  instanceof check
public static void main(String[] args)
{
Animal animal = new Tiger();
doAllAction(animal);

Animal animal2 = new Cat();
doAllAction(animal2);

Animal animal3 = new Animal();
doAllAction(animal3);
}

public static void doAllAction(Animal animal)
{
if (animal instanceof Tiger)
{
Tiger tiger = (Tiger) animal;
tiger.doTigerActions();
}

if (animal instanceof Cat)
{
Cat cat = (Cat) animal;
cat.doCatActions();
}

animal.doAnimalActions();
}
At narito kung bakit. Tingnan ang halimbawa sa kaliwa.

Hindi namin (ang aming code) palaging alam kung anong uri ng bagay ang aming pinagtatrabahuhan. Maaaring ito ay isang bagay na kapareho ng uri ng variable (Animal), o anumang uri ng descendant (Cat, Tiger).

Isaalang-alang ang paraan ng doAllAction. Gumagana ito nang tama, anuman ang uri ng bagay na ipinasa.

Sa madaling salita, gumagana ito nang tama para sa lahat ng tatlong uri: Hayop, Pusa, at Tigre.

public static void main(String[] args)
{
Cat cat = new Tiger();
Animal animal = cat;
Object obj = cat;
}
Narito mayroon kaming tatlong pagpapatakbo ng pagtatalaga. Lahat ng mga ito ay mga halimbawa ng pagpapalawak ng mga conversion.

Ang uri ng cast operator ay hindi kailangan dito, dahil walang tseke ang kailangan. Ang isang object reference ay maaaring palaging naka-imbak sa isang variable na ang uri ay isa sa mga ninuno nito.

"Naku, nilinaw ng pangalawa hanggang sa huling halimbawa ang lahat: bakit kailangan ang tseke, at bakit kailangan ang type casting."

"Sana nga. Gusto kong ituon ang iyong pansin sa katotohanang ito:"

Wala sa mga ito ang nagiging sanhi ng pagbabago sa isang bagay sa anumang paraan! Ang tanging bagay na nagbabago ay ang bilang ng mga pamamaraan na magagamit upang tawagan sa isang partikular na reference variable.

Halimbawa, hinahayaan ka ng variable ng Cat na tawagan ang mga pamamaraan ng doAnimalActions at doCatActions. Wala itong alam tungkol sa paraan ng doTigerActions, kahit na tumuturo ito sa isang bagay na Tiger.

"Yep, I get it. Mas madali kaysa sa inaakala ko."