Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Waarom moet hier worden getypecast? Java

Pagina: 1
Acties:
  • 320 views

  • denwilly
  • Registratie: April 2009
  • Laatst online: 00:41
Hi,

Ik heb binnenkort examen Java en begrijp dit deel van mijn cursus maar niet.

@override
public boolean equals(Object o) {
if (o != null && o instanceof Person){

Person pers = (Person)o; <---- typecasting???
return this.getNaam().equals(pers.getNaam()) && this.getId() == pers.getId();

}
return false;
}
}

Nu is mijn vraag, waarom wordt er daar getypcast?
In de if regel wordt toch al bekeken of het Object 'o' een Person is? ('instanceof')
Als het object dan toch al een Person is, waarom typecast je dan?

  • Lightah
  • Registratie: Mei 2002
  • Laatst online: 29-11 23:53

Lightah

Strikes Again

Anders kan je niet bij de methodes? Als Object zijn de specifieke Person methodes nog onzichtbaar.

The Unpredictable Striker!


  • denwilly
  • Registratie: April 2009
  • Laatst online: 00:41
kan je dan niet onmiddellijk 'equals(Person o)' gebruiken?

  • Lightah
  • Registratie: Mei 2002
  • Laatst online: 29-11 23:53

Lightah

Strikes Again

In dit geval is equal true als de naam en het Id gelijk is. Ik denk dat een standaard equal een ander resultaat heeft.

The Unpredictable Striker!


  • denwilly
  • Registratie: April 2009
  • Laatst online: 00:41
public boolean equals(Person o) {


return this.getNaam().equals(p.getNaam()) && this.getId() == o.getId();

}

Is dit dan niet hetzelfde?

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 20:48
denwilly schreef op vrijdag 20 augustus 2010 @ 20:27:
Hi,

Ik heb binnenkort examen Java en begrijp dit deel van mijn cursus maar niet.

@override
public boolean equals(Object o) {
if (o != null && o instanceof Person){

Person pers = (Person)o; <---- typecasting???
return this.getNaam().equals(pers.getNaam()) && this.getId() == pers.getId();

}
return false;
}
}

Nu is mijn vraag, waarom wordt er daar getypcast?
In de if regel wordt toch al bekeken of het Object 'o' een Person is? ('instanceof')
Als het object dan toch al een Person is, waarom typecast je dan?
Omdat je het object binnen krijgt als een Object en niet als een Person instantie. Je checkt met o instanceof alleen maar of ie van dat type is. Zo ja dan wil je er iets speciaals mee doen en zul je dus tegen je code moeten zeggen.. "he das een person object". Zodat je code de class def erbij kan pakken en kan zien wat je er allemaal mee kan.

Een 'object' kan namelijk van alles zijn.
denwilly schreef op vrijdag 20 augustus 2010 @ 20:35:
public boolean equals(Person o) {


return this.getNaam().equals(p.getNaam()) && this.getId() == o.getId();

}

Is dit dan niet hetzelfde?
Dat kun je ook doen maar nu klopt je method signature van equals niet meer met het origineel en krijg je problemen bij aanroep van equals ( ..dacht ik )

[ Voor 16% gewijzigd door Webgnome op 20-08-2010 20:38 ]

Strava | AP | IP | AW


  • denwilly
  • Registratie: April 2009
  • Laatst online: 00:41
Ok, bedankt voor de snelle hulp.

Deze mag gesloten worden

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Je moet begrijpen dat het object 'o' altijd al een Person was (tenzij het iets anders is natuurlijk maar neem even aan dat het inderdaad een Person is). Maar, omdat de methode een Object accepteert weet de compiler dit nog niet. Je zou net zo goed een int of een string kunnen meegeven omdat die allemaal van Object overerven. Ook al zegt de code dat het een Object is, in de realiteit is het nog steeds een Person. Vergelijking met de realiteit: als ik je zeg dat ik een snoepje in mijn hand heb, dan weet je alleen dat ik een snoepje heb en niet welk snoepje. Misschien heb ik een dropje of een lolly. Voor jou is dat onbekend, maar het is nog steeds een dropje of een lolly.

Met de eerste if check vraag je alleen of het object 'o' ook daadwerkelijk een Person is. Daarmee heb je nog niets gecast.
Daarna wil je de 'getNaam' methode van het object 'o' gebruiken, en om dat te doen zul je moeten casten.

Ik snap wel wat je bedoelt: als je eerst checked of 'o' een Person is, dan kan de compiler toch weten dat het daarna een person is? Maar zo werkt het nu eenmaal niet. De compiler is "niet slim genoeg" (en dat zou ook niet moeten imo) om dat zover door te trekken. JIJ weet nu dat het een Person is, dus je kunt veilig casten en het zo ook aan de compiler vertellen.

Mijn iRacing profiel


  • rapture
  • Registratie: Februari 2004
  • Laatst online: 19:40

rapture

Zelfs daar netwerken?

Als je een List hebt om de inhoud van een vliegtuig, dan ben je niet zeker dat alles in de List een Person is. Het kan even goed een Suitcase, een Mailbag,... zijn. Vandaar worden de elementen in de List als objects behandeld bij het doornemen en dat kan omdat Person, Suitcase, Mailbag,... van Object afgestamd zijn.

Dan kan je controleren of een bepaalde Object een Person is of niet. Als het een Person is, dan kan je typecasten tot Person en je krijgt de methodes van een Person te zien

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

denwilly schreef op vrijdag 20 augustus 2010 @ 20:40:
Ok, bedankt voor de snelle hulp.

Deze mag gesloten worden
Ik ga het topic inderdaad sluiten maar niet omdat je je antwoord al hebt... Ik ga het sluiten omdat je zelf totaal geen inzet toont. De meeste vragen die je stelt worden in elk basisboek over Java wel beantwoord. Zie ook De Quickstart.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.