Hvordan typecast i Java 6

I programmering, refererer typecasting for å ta et objekt av en type og omdanner den til et objekt av en annen type. I Java 6, dette vanligvis, men ikke alltid, innebærer enten støping oppad eller støping nedad som betyr å kaste en gjenstand opp eller ned arvehierarkiet.

Bruksanvisning

1 Lim inn følgende Java-klasser i en tom tekstfil. Dette er klassen som skal brukes for opplæringen:

public class Person {}

public class MalePerson strekker Person {}

2 Lim inn følgende upcast:

Person p = new MalePerson("Tom");

Den MalePerson klasse er en underklasse av Person, så dette er en kaste opp i hierarkiet. Støping oppad er den enkleste typen cast å trekke av. Java bare vet hva de skal gjøre når en underklasse er tildelt en av sine forfedre. Lag en mental notat, men: Java vil alltid huske hva et objekt virkelig er under en upcast. Selv nå som MalePerson "Tom" har blitt tildelt en generisk person objekt, husker Java at dette objektet er virkelig en MalePerson.

3 Lim inn følgende nedslåtte:

Person p = new MalePerson("Tom");

MalePerson m = (MalePerson) p;

Downcasts som dette, som beveger seg nedover i hierarkiet, kreve programmerer for å angi klassen typen som brukes for skuespillerne i parentes. Imidlertid er støping nedad mer kompleks enn støping oppad.

4 Forsøk følgende nedslåtte:

Person p = new Person("Jane");

MalePerson m = (MalePerson) p;

Dette forsøket mislykkes, og det bør ikke være vanskelig å se hvorfor. Selv om det er rimelig å anta at en MalePerson er en person, er det ikke rimelig for datamaskinen å anta at alle personer er MalePersons. Noen kan være FemalePersons, og forskjellen kan eller ikke kan være trivielt for datamaskinens formål. Bare for å være sikker, kaster programmet en feil.

En nedslått kan bare skje hvis en upcast har skjedd først, noe som er grunnen til at upcast i trinn 3 var gyldig, men ikke i trinn 4. Dette kan gjøre støping oppad høres ubrukelig først. Det begs spørsmålet om hvorfor upcast ble utført i første omgang, men holder den tanken.

5 Tenk på følgende måte:

public void greet (Person p) {

if (p instanceof MalePerson) {

MalePerson m = (MalePerson) p;

m.doMaleThings ();

} Else if (p instanceof FemalePerson) {

FemalePerson f = (MalePerson) p;

f.doFemaleThings ();

} Else kaste nytt GenderConfusionException ();

}

Forfatteren av denne metoden har ingen måte å vite på forhånd om denne metoden vil bli kalt med en MalePerson eller en FemalePerson objekt, så han bruker den generiske Person objekt. Deretter bruker han instanceof kommandoen for å hente fra den person som er gitt, og se om han skulle nedbrutte det som en mannlig eller en kvinnelig person.