It's not a secret anymore!
The moose likes Beginning Java and the fly likes Casting question Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » Beginning Java
Bookmark "Casting question" Watch "Casting question" New topic

Casting question

Tony Smith
Ranch Hand

Joined: Jul 07, 2007
Posts: 229
If this has been asked recently feel free to direct me to the right post...

I understand it is possible to downcast a parent object to a child object. For example:

Asuusming child extends parent
Parent p = new Parent();
Child c = new Child();

c = (Child)p;

When would this be necessary? And when would this be a bad idea? Thanks.
marc weber

Joined: Aug 31, 2004
Posts: 11343

I posted an example of this yesterday under this topic. See if that makes sense, and come back with any questions.

"We're kind of on the level of crossword puzzle writers... And no one ever goes to them and gives them an award." ~Joe Strummer
Rob Spoor

Joined: Oct 27, 2005
Posts: 20276

Originally posted by Tony Smith:
When would this be necessary? And when would this be a bad idea? Thanks.

You should do this if:
1) you are 100% sure the object is a Child, or a subclass of Child (p instanceof Child returns true). Your object inheritance tree might ensure that.
2) you need the extra methods / fields that Child provides and Parent does not.

If 1) does not hold you may get a ClassCastException if the is not a Child. If 2) does not hold then there is no reason to cast.

How To Ask Questions How To Answer Questions
Stan James
(instanceof Sidekick)
Ranch Hand

Joined: Jan 29, 2003
Posts: 8791
Following on from Rob's post, this kind of thing would work:

The compiler assures us the parameter is a Parent or some extension of it, but it can't guarantee that the parameter is a Child. If we left out the instanceof test and somebody passed in a Parent, the (Child)x cast would throw an exception.

This kind of test and cast is often a sign of a design that we should improve, but sometimes it's hard to avoid.

A good question is never answered. It is not a bolt to be tightened into place but a seed to be planted and to bear more seed toward the hope of greening the landscape of the idea. John Ciardi
Adam Nace
Ranch Hand

Joined: Jul 17, 2006
Posts: 117
Originally posted by Tony Smith:

Parent p = new Parent();
Child c = new Child();

c = (Child)p;

Note that your code, as written, is not valid. We know that the run-time type of p is Parent, not Child (because we can see that you instantiated it that way). Casting is appropriate where the run-time type is actually a child, and it is not, here.

Also, note that you are creating a new Child object and assigning it to c, only to be overwritten in the next line. Are you sure you understand the difference between defining a variable, and initializing it?

- Adam
I agree. Here's the link:
subject: Casting question
It's not a secret anymore!