In Java, suppose I have 3 classes, C extends from B which extends from A.
class X {
interface A {}
interface B extends A {}
interface C extends B {}
void f(A a) {}
void test() {
C c = new C()
B b = (B) c;
f(b);
}
}
If I do something like this as shown in test() above:
C c = new C()
B b = (B) c;
f(b);
f() accepts b as type C since C and B both extend from A. I wanted f() to receive b as type B and not type C.
Is there anyway to force this upcasting?
f()will always receive something typed as A (despite under the covers it’s actually a B or C, and can be downcast appropriately).You can define an additional f() thus
and if necessary
and the correct one will be called depending on the class of the argument. i.e. the compiler determines which function is called depending on the type of the argument. This is different from a dynamic dispatch (or polymorphism) which would occur at runtime.
Note that your cast in the question is redundant. You can write:
since C extends from B, C is a B.