2011-10-13 11 views
20

Probablemente no se pueda hacer (me sale un error de compilación: "El método heredado A.doSomthing (int) no puede ocultar el método abstracto público en B"):Java: ampliando una clase e implementando una interfaz que tiene el mismo método

public class A { 
    int doSomthing(int x) { 
     return x; 
    } 
} 

public interface B { 
    int doSomthing(int x); 
} 

public class C extends A implements B { 

    //trying to override doSomthing... 

    int doSomthing(int x) { 
     return doSomthingElse(x); 
    } 
} 

Suponiendo que se me permite cambiar ni a ni B, mi pregunta es ¿hay algún modo de definir C de tal manera que va a heredar de ambos a y B (supongamos que es requerido para algunas marco esa C será a la vez una instancia de A y B).

O si no, ¿cómo solucionarías esto?

Gracias!

+0

favor, informe de su error. No hay nada obviamente incorrecto aquí, excepto quizás un @Overrides que falta si estás usando 1.6. – bmargulies

+2

@bmargulies, no hay 'public' y anular es solo una molestia opcional. – bestsss

Respuesta

24

hacen que el método público

public class C extends A implements B { 

    //trying to override doSomthing... 

    public int myMethod(int x) { 
     return doSomthingElse(x); 
    } 
} 

métodos de interfaz son siempre public

o simplemente utilizar la composición en lugar de la herencia

+0

Gracias y todos los otros respondedores. ¡Solucionó el problema! – rapt

+0

¿Es posible que una variable sea una instancia de clase y herede una interfaz? En su ejemplo, sería algo así como 'new C() implementa X' suponiendo que X es la interfaz – Vadorequest

+1

@Vadorequest la implementación o extensión se realiza en el nivel de clase y no en el nivel de instancia. Para implementar X también debe agregarlo a la lista de interfaz: 'public class C extends A implementa B, X {...}' –

2

Esto tiene que ver con la visibilidad. Está utilizando default (sin modificador) de visibilidad en C para myMethod, pero debe ser public de acuerdo con la interfaz B.

Ahora usted podría pensar que utilizó la visibilidad default para todos ellos, ya que en ninguno de A, B, ni C ¿Ha seleccionado explícitamente uno de public, private, o protected. Sin embargo, la interfaz usa public, lo indique explícitamente o no.

+0

¡Gracias! De hecho, lo sabía, pero me lo recuerdas. – rapt

0

Simplemente hacer el método public al anularlo en C hará.

7

El método doSomethis() es paquete-privada en la clase A:

public class A { 
    int doSomthing(int x) { // this is package-private 
     return x; 
    } 
} 

pero es pública en la interfaz B:

public interface B { 
    int doSomthing(int x); // this here is public by default 
} 

compilador está tomando el doSomething() heredada por C de A que es paquete-privado como la implementación de uno en B que es public. Es por eso que se queja -

"The inherited method A.doSomthing(int) cannot hide the public abstract method in B"

Porque, mientras primordial un método que no se puede reducir el nivel de acceso del método.

solución es fácil, en clase C -

@Override 
public int doSomthing(int x) { 
    // ... 
} 
Cuestiones relacionadas