I dataprogrammering, refererer typecasting å ta et objekt av en type og konvertere den til et objekt av en annen type. I Java 6 , dette vanligvis , men ikke alltid, innebærer enten upcasting eller downcasting , som betyr å kaste en gjenstand opp eller ned arvehierarkiet . Instruksjoner
en
Lim følgende Java-klasser i en tom tekstfil . Dette er klassen som skal brukes for opplæringen : en
public class Person { }
public class MalePerson strekker Person { }
2
Lim inn følgende upcast : en
person p = new MalePerson ( " Tom ");
MalePerson klassen er en underklasse av person , så dette er en støpt opp i hierarkiet. Upcasting er den enkleste type cast å trekke seg. Java vet rett og slett hva de skal gjøre når en underklasse er tildelt en av sine forfedre. Gjør et mentalt notat , men: Java vil alltid huske hva et objekt er virkelig 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ått : .
< P > person p = new MalePerson ( " Tom ");
MalePerson m = ( MalePerson ) p;
Downcasts som dette, som beveger seg nedover i hierarkiet , kreve programmerer å angi klassetype brukes for støpt i parentes . Imidlertid er downcasting mer kompleks enn upcasting
4
Forsøk følgende nedslått : en
Person p = new Person ( " Jane ");
MalePerson m = . ( MalePerson ) p;
Dette forsøket mislykkes, og det bør ikke være vanskelig å se hvorfor . Mens 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 upcasting lyd ubrukelig først. Det reiser spørsmålet om hvorfor upcast ble utført i første omgang , men hold den tanken
5
Tenk på følgende måte : .
Public void hilse ( Person p) {
if ( p instanceof MalePerson ) {
MalePerson m = ( MalePerson ) p;
m.doMaleThings () ;
} else if ( p instanceof FemalePerson ) {
FemalePerson f = ( MalePerson ) p;
f.doFemaleThings ();
} else throw new 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 den person som er gitt , og se om han skulle nedslått det som en mannlig eller en kvinnelig person .