Very interesting question. Awarding a
cow for it because I found out a few things looking up information about this.
So, it seems to me that a couple of things come into play here:
1. static vs dynamic binding
2. Type erasure and
polymorphism.
Refer to
https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html
The synthetic/bridge method is generated by the compiler to preserve the polymorphism of generic types after type erasure. That seems to indicate to me that the bridge only gets involved when static binding happens at compile time. Or maybe not. Normally, polymorphism involves dynamic binding so if the correct method to execute is determined at runtime, I would think that there would be no need to go through the bridge method. But then again, the dynamic binding goes by the method signature and only the synthetic bridge method has the signature that matches the one in the parent class after type erasure. I'm just writing this stuff as I think about it so excuse the flipflopping. The more I think about it though the more I tend to agree with the original guess that the polymorphic call goes through the synthetic bridge. The bridge would not be involved if binding happens statically to the subclass method with the specific type.
Another thing to consider is that a ClassCastException will be thrown at runtime. That would be happening in the synthetic method, which I guess would be the result of static binding(?). Anyway, I haven't tried any of this myself but you might try throwing a runtime exception somewhere strategic so you can look at the stack trace and see if the synthetic method was involved in the call. You'll probably have to put the throw inside an if statement that checks a non-final variable in its condition so your code will compile.
Another article that this question led me to was this:
http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html