Please explain this polymorphism twist to me.
Hi there,
I discovered a strange twist in polymorphism that leaves me in the
dark. If you can figure out what the following output will be, then
please explain to me why.
public class OverloadTest {
public class Visitor {
public void visit(Super s) {
System.out.println("Visitor.visit(Super)");
}
public void visit(Sub s) {
System.out.println("Visitor.visit(Sub)");
}
}
public class Super {
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class Sub extends Super {
}
public static void main(String[] args) {
OverloadTest o = new OverloadTest();
Sub s = o.new Sub();
s.accept(o.new Visitor());
}
}
-------------- The answer is: (scroll down)
-
-
-
-
-
-
-
-
-
-
-
"Visitor.visit(Super)"
That means, the call "visitor.visit(this);" in the type Super is
handled by "Visitor.visit(Super)" instead of "Visitor.visit(Sub)".
This occurs as especially strange to me because a look in the debugger
confirms that the actual (dynamic) type of "this" is Sub! In my
opinion, the call should therefore be dynamically handled by
"Visitor.visit(Sub)".
I hope I didn't confuse you with Super-Sub, now, and you can tell me
where I need to review the JLS to turn on my light again.
--
Cheers
Martin