I datorprogrammering , hänvisar Typecasting att ta ett objekt av en typ och omvandla den till ett objekt av en annan typ . I Java 6 , detta oftast , men inte alltid , innebär antingen upcasting eller downcasting , vilket innebär att kasta ett objekt uppåt eller nedåt arvshierarkin . Instruktioner
1
klistra in följande Java-klasser i en tom textfil . Dessa är den klass som ska användas för den läraren :
public class Person { }
public class MalePerson utökar Person { }
2
Klistra in följande upcast :
Person p = new MalePerson ( " Tom " ) ;
MalePerson klass är en underklass till person , så detta är en gjuten upp i hierarkin . Upcasting är den enklaste typen av rösterna för att dra bort . Java vet helt enkelt vad man gör när en underklass tilldelas en av sina förfäder . Gör en mental anteckning , dock : Java kommer alltid ihåg vad ett objekt är verkligen under en upcast . Redan nu att MalePerson " Tom " har tilldelats en generisk person som objekt , minns Java att detta objekt är verkligen en MalePerson
3
Klistra in följande nedslagen : .
Person p = new MalePerson ( " Tom " ) ;
MalePerson m = ( MalePerson ) p;
Downcasts som denna , att flytta ner i hierarkin , kräva programmeraren att ange klasstyp används för den gjutna inom parentes. Dock är downcasting mer komplex än upcasting
4
Försök följande nedslagen :
Person p = new Person ( " Jane " ) ,
MalePerson m = . ( MalePerson ) p;
Detta försök misslyckas , och det borde inte vara svårt att se varför . Även om det är rimligt att anta att en MalePerson är en människa , är det inte rimligt för datorn att anta att alla personer är MalePersons . Några kan vara FemalePersons , och skillnaden kan eller inte kan vara trivialt för datorns ändamål . Bara för att vara säker , kastar programmet ett fel .
En nedslagen kan bara ske om en upcast har skett först , varför upcast i Steg 3 var giltigt , men inte i steg 4 . Detta kan göra upcasting ljud värdelös i början. Det väcker frågan om varför upcast utfördes i första hand , men håll den tanken
5
Betrakta följande metod : .
Public void hälsar ( Person p ) {
om ( p instanceof MalePerson ) {
MalePerson m = ( MalePerson ) p;
m.doMaleThings ();
} else if ( p instanceof FemalePerson ) {
FemalePerson f = ( MalePerson ) p;
f.doFemaleThings ();
} else kasta nytt GenderConfusionException ();
}
författaren av denna metod har ingen möjlighet att veta i förväg om denna metod kommer att kallas med ett MalePerson eller en FemalePerson objekt , så han använder den generiska Person objektet . Sen använder han instanceof kommando att hämta den person ges och se om han ska nedslagen det som en manlig eller en kvinnlig person .