Java Reference
In-Depth Information
PITFALL: Overloading and Automatic Type Conversion
Automatic type conversion of arguments (such as converting an
int
to a
double
when the parameter is of type
double
) and overloading can sometimes interact in
unfortunate ways. So, you need to know how these two things interact.
For example, consider the following method that might be added to the class
DateSixthTry
in Display 4.11 :
public void
increase(
double
factor)
{
year = (
int
)(year + factor*year);
}
If you add this method to the class
DateSixthTry
, then the following presents no
problems, where
date
is an object of type
DateSixthTry
that has been set to some date:
date.increase(2);
The
int
value of 2 is type cast to the
double
value
2.0
, and the value of
date.year
is changed as follows:
date.year = (
int
)(date.year + 2.0*date.year);
(Because
year
is private in the class
DateSixthTry
, you cannot write this in a
program that uses the class
DateSixthTry
, but the meaning of this expression is
clear.)
So far, so good. But now suppose we also add the following method defi nition to
the class
DateSixthTry
:
public void
increase(
int
term)
{
year = year + term;
}
This is a valid overloading because the two methods named
increase
take parameters
of different types. With both of these methods named
increase
added to the class,
the following now behaves differently:
date.increase(2);
If Java can find an exact match of types, it uses the method definition with an exact
match before it tries to do any automatic type casts. So now the displayed invocation
of
date.increase
is equivalent to
date.year = date.year + 2;
However, if you meant to use an argument of
2.0
for
date.increase
and instead
used 2, counting on an automatic type cast, then this is not what you want. It is
best to avoid overloading where there is a potential for interacting dangerously with
automatic type casting, as in the examples discussed in this Pitfall section.