> I have one abstract class Form in which ApplicationForm and
> KindergartenForm extends. In my Query class I check wether Form f is
[quoted text clipped - 6 lines]
> 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

Signature
[ 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
Cruella DeVille - 11 May 2006 17:09 GMT
Thanks! Never would have thought of that on my own
Much better code now!
> I have one abstract class Form in which ApplicationForm and
> KindergartenForm extends. In my Query class I check wether Form f is
[quoted text clipped - 17 lines]
>
> }
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
Chris Uppal - 11 May 2006 17:16 GMT
> 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
Robert Klemme - 12 May 2006 09:16 GMT
>> KindergartenForm kf = (KindergartenForm ) f;
>> f.kinderMethod();
[quoted text clipped - 6 lines]
> kf.kinderMethod();
> kf.anotherKinderMethod();
Ooops! Yes, of course! Thanks for catching that!
robert