proyecto - Métodos de interfaz en conflicto en Java
java desde cero 27 (6)
Posible duplicado:
Método de colisión en la implementación de la interfaz - Java
¿Qué hacemos si necesitamos implementar dos interfaces que contengan un método con el mismo nombre y parámetros, pero con diferentes tipos de retorno? Por ejemplo:
interface A {
public int foo();
}
interface B {
public double foo();
}
class C implements A, B {
public int foo() {...} // compilation error
}
¿Hay una manera fácil de superar este problema?
La solución más sencilla es devolver siempre el double
en A, ya que puede almacenar todos los valores int
posibles.
Si no es una opción, debe utilizar una alternativa a la herencia.
class C {
public A getA();
public B getB();
}
C c = new C();
int a = c.getA().foo();
double b = c.getB().foo();
Puede escribir una clase de Adapter para implementar una de las interfaces.
Ejemplo de implementación:
class AdapterA implements A{
AdapterA(C c){impl = c;}
private final C impl;
public int foo(){return c.fooReturningInt();}
}
class C implements B{
public double foo(){...}
public int fooReturningInt(){...}
}
Tu método foo()
claramente no está bien definido. Probablemente debería haber una interfaz principal con un public Number foo()
, que se extiende por A y B, que lo anulan a un tipo más específico. Realmente no hay una forma sensata en que su clase pueda implementar ambas interfaces a menos que cambie el nombre de uno de los métodos foo
.
Un método en Java está definido únicamente por su firma. De http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
Definición: Dos de los componentes de una declaración de método comprenden la firma del método: el nombre del método y los tipos de parámetros.
Use Number en lugar de double e int en la interfaz A y B.
Usted no puede Java identifica de forma única los métodos por su nombre y sus parámetros, no por su tipo de retorno.