9

Digamos que tengo dos interfaces interfaz A y la interfaz B:consulta acerca de las interfaces en Java

public interface A { 
    public int data(); 
} 

public interface B { 
    public char data(); 
} 

interfaz A tiene un método public int data() y la interfaz B tiene un método public char data().

cuando implemento ambas interfaces A y B en alguna clase C el compilador me da un error. ¿Es esto un defecto en Java? Como supongo que esta es una de las principales razones por las que no se nos permite extender más de una clase, ¿por qué se nos permite implementar más de una interfaz cuando el problema persiste?

+1

¿Podría publicar el mensaje de error? – higuaro

+0

code please .... –

Respuesta

7

The Java Tutorials: Defining Methods - Overloading Methods estados,

El lenguaje de programación Java soporta la sobrecarga de métodos, y Java puede distinguir entre métodos con diferentes firmas de métodos. Esto significa que los métodos dentro de una clase pueden tener el mismo nombre si tienen listas de parámetros diferentes.

también,

no se puede declarar más de un método con el mismo nombre y la mismo número y tipo de argumentos, ya que el compilador no puede decir diferenciarlos.

El compilador no tiene en cuenta el tipo de devolución al diferenciar los métodos , por lo que no puede declarar dos métodos con la misma firma aunque tengan un tipo de devolución diferente.

Los dos métodos implementados comparten un común método de firma (es decir data()) y como tal, el compilador no puede diferenciar entre los dos y tendrá que un único método satisfacer tanto los contratos de interfaz.


Editar:

Por ejemplo,

public class Foo implements IFoo, IBar{ 

    public static void main(String[] args) { 
     Foo foo = new Foo(); 
     ((IFoo) foo).print(); 
     ((IBar) foo).print(); 
    } 

    @Override 
    public void print() { 
     System.out.println("Hello, World!"); 
    } 
} 

public interface IBar { 
    void print(); 
} 

public interface IFoo { 
    void print(); 
} 

cual es la salida,

Hello, World! 
Hello, World! 
+0

Entonces, ¿cómo trata java un método con la misma firma y el mismo tiempo de retorno en múltiples interfaces? – chaosguru

+1

Creo que compilará con éxito :) – chaosguru

+1

si es la misma firma, el mismo nombre y el mismo tipo de devolución no hay nada que hacer, ambas interfaces están satisfechas con la implementación. Ambas interfaces están implementadas. –

2

El problema que se presenta es nada relacionado con la herencia múltiple. Tampoco es la implementación de clase que implementa más de una interfaz.

Cuando define una interfaz, solo está diciendo que el implementador de esta interfaz debe aceptar un contrato e implementar todos los métodos definidos en esa interfaz.

Una implementación de clase puede implementar más de una interfaz sin problemas, pero la interfaz no puede entrar en conflicto. En su caso está tratando de implementar dos interfaces que declara un método con la misma firma.

Una firma de método se compone por nombre y tipo de parámetros en java.

Definición: Dos de los componentes de una declaración de método comprenden el método signature-el nombre del método y los tipos de parámetros.

http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

Con el fin de sobrecargar un método que necesita tener diferentes firmas.

La herencia múltiple en Java no está permitida, ya que hay problemas complejos, como definir qué implementación debe tener lugar cuando dos o más superclases implementan el método. Para este tema, sugiero echar un vistazo al Diamond Problem

De hecho, las interfaces se utilizan en algunas situaciones para simular herencia múltiple, lo que permite que las clases presenten un conjunto combinado de métodos.

0

Una solución es utilizar una clase interna:

  1. Tu "clase C" implementa la interfaz "A"

  2. También tienen una "D" clase interna que implementa la interfaz "C" :

    public class A {C implementa ... clase D privada implementa B {

Si realmente necesita ambas interfaces de la misma clase, esto podría permitir que le permite tener su pastel y comérselo también :)

+0

¿Quiere decir que la clase D de innner implementa B? – chaosguru

4

El compilador de Java (C# También pienso) no diferencia los métodos por su valor de retorno . En su caso, ambos métodos son considerados iguales por el compilador a pesar de la diferencia en el tipo de devolución

Cuestiones relacionadas