Java ¿Cómo llamar al método de los abuelos?

Posible duplicado:
¿Por qué es super.super.method (); no permitido en Java?

Supongamos que tengo 3 clases A , B y C , cada una extendiendo la anterior.

¿Cómo A.myMethod() el código en A.myMethod() de C.myMethod() si B también implementa myMethod ?

 class A { public void myMethod() { // some stuff for A } } class B extends A { public void myMethod() { // some stuff for B //and than calling A stuff super.myMethod(); } } class C extends B { public void myMethod() { // some stuff for C // i don't need stuff from b, but i need call stuff from A // something like: super.super.myMethod(); ?? how to call A.myMethod(); ?? } } 

No puedes. Esto es deliberado.

La clase B proporciona una interfaz (como en el concepto, no la palabra clave de Java) a las subclases. Ha elegido no dar acceso directo a la funcionalidad de A.myMethod . Si necesita que B proporcione esa funcionalidad, entonces use un método diferente (nombre diferente, protected ). Sin embargo, es mejor “preferir la composición a la herencia”.

No puedes, y no deberías.

Esto es un signo de mal diseño. Cambie el nombre de un método o incluya la funcionalidad común requerida en otro método o clase de utilidad.

No estoy seguro de que puedas. Java hace que todos los métodos sean virtuales por defecto. Esto significa que la solución más simple no funcionará: declare una variable de tipo A , asigne su instancia C y llame a myMethod para que se llame a myMethod .

Podría intentar reflejar el tipo A e invocar sus métodos directamente. Sería interesante ver qué sucede en este caso, pero me sorprendería si el envío virtual no sucediera …