Permanent casting of an object

C

Cruella DeVille

I have one abstract class Form in which ApplicationForm and
KindergartenForm extends. In my Query class I check wether Form f is
instanceof ApplicationForm vs KindergartenForm and cast f thereafter.

But everytime I call a method from eg. ApplicationForm on f (that is
already casted to ApplicationForm) I have to cast again. Is there a way
to permanently cast f to either ApplicationForm or KindergartenForm or
do I have to cast every time I invoke a method on my f object?

Is it so that I can cast from children to parents without stress, but
the other way around is a repetitive task?

Form form;
public void register(Form f){
if(f istanceof KindergartenForm)
this.form = (KindergartenForm)f;
else if(f instanceof ApplicationForm)
this.form = (ApplicationForm)f;
// do stuff based on type of form

}

This does not permanently cast f to correct type, how come?
 
G

Gordon Beaton

I have one abstract class Form in which ApplicationForm and
KindergartenForm extends. In my Query class I check wether Form f is
instanceof ApplicationForm vs KindergartenForm and cast f
thereafter.

But everytime I call a method from eg. ApplicationForm on f (that is
already casted to ApplicationForm) I have to cast again. Is there a
way to permanently cast f to either ApplicationForm or
KindergartenForm or do I have to cast every time I invoke a method
on my f object?
[...]

This does not permanently cast f to correct type, how come?

First, the fact that you seem to need more than occasional use of
instanceof and casting is a strong indication of poor design. For
example, the "do stuff based on type of form" probably belongs in the
specific subclasses. Then you'd simply do f.doStuff() and the correct
method would be invoked.

Realize that casting does not change the object or its type in any
way. Casting simply lets you use an Object reference as if it referred
to an Object of a different type.

So if you have a reference that looks like this:

Form f = ...

Then f is and always will be a Form reference.

If you know that your object is a KindergartenForm (a subclass of
Form), then declare a KindergartenForm reference:

KindergartenForm kf = ...

If the Form object is in fact a KindergartenForm, you can assign f to
kf with a cast:

kf = (KindergartenForm)f;

After that, you can use kf as a KindergartenForm without additional
casting.

/gordon
 
R

Robert Klemme

Cruella said:
I have one abstract class Form in which ApplicationForm and
KindergartenForm extends. In my Query class I check wether Form f is
instanceof ApplicationForm vs KindergartenForm and cast f thereafter.

But everytime I call a method from eg. ApplicationForm on f (that is
already casted to ApplicationForm) I have to cast again. Is there a way
to permanently cast f to either ApplicationForm or KindergartenForm or
do I have to cast every time I invoke a method on my f object?

Is it so that I can cast from children to parents without stress, but
the other way around is a repetitive task?

Form form;
public void register(Form f){
if(f istanceof KindergartenForm)
this.form = (KindergartenForm)f;
else if(f instanceof ApplicationForm)
this.form = (ApplicationForm)f;
// do stuff based on type of form

}

There is no casting needed. Since f is of type Form and "form" is also
of type form you can simply assign it. If in your method you need to
apply KindergartenForm operations to f and you want to avoid repeated
casting you can simply do

KindergartenForm kf = (KindergartenForm ) f;
f.kinderMethod();
f.anotherKinderMethod();

You probably come from a C++ background where casting usually involves
creating a new instance. This is not the case with Java. The situation
is comparable to using C++ pointers and dynmic_cast.


HTH

robert
 
C

Chris Uppal

Robert said:
KindergartenForm kf = (KindergartenForm ) f;
f.kinderMethod();
f.anotherKinderMethod();

Very small typo, but one which might be rather confusing in this context.
That should read:

KindergartenForm kf = (KindergartenForm ) f;
kf.kinderMethod();
kf.anotherKinderMethod();

-- chris
 
R

Robert Klemme

Chris said:
Very small typo, but one which might be rather confusing in this context.
That should read:

KindergartenForm kf = (KindergartenForm ) f;
kf.kinderMethod();
kf.anotherKinderMethod();

Ooops! Yes, of course! Thanks for catching that!

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,175
Latest member
Vinay Kumar_ Nevatia
Top