Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Permanent casting of an object

Reply
Thread Tools

Permanent casting of an object

 
 
Cruella DeVille
Guest
Posts: n/a
 
      05-11-2006
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?

 
Reply With Quote
 
 
 
 
Gordon Beaton
Guest
Posts: n/a
 
      05-11-2006
On 11 May 2006 06:28:23 -0700, Cruella DeVille wrote:
> 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

--
[ do not email me copies of your followups ]
g o r d o n + n e w s @ b a l d e r 1 3 . s e
 
Reply With Quote
 
 
 
 
Robert Klemme
Guest
Posts: n/a
 
      05-11-2006
Cruella DeVille wrote:
> 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
 
Reply With Quote
 
Cruella DeVille
Guest
Posts: n/a
 
      05-11-2006
Thanks! Never would have thought of that on my own

Much better code now!

 
Reply With Quote
 
Chris Uppal
Guest
Posts: n/a
 
      05-11-2006
Robert Klemme wrote:

> 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





 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      05-12-2006
Chris Uppal wrote:
> Robert Klemme wrote:
>
>> 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();


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

robert
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Up casting and down casting Sosuke C++ 2 12-20-2009 03:24 PM
Problem with depracated casting method (down casting) Wally Barnes C++ 3 11-20-2008 05:33 AM
Web Service with permanent object cached? df ASP .Net Web Services 1 12-07-2005 10:25 AM
Another question about inheritance (up-casting and down-casting) kevin Java 11 01-08-2005 07:11 PM
Thunderbird: Imap permanent connection. Calimero Firefox 0 01-23-2004 03:30 PM



Advertisments