Конфликтные методы интерфейса в Java
Возможный дубликат:
Идентификация имени метода в реализации интерфейса - Java
Что нам делать, если нам нужно реализовать два интерфейса, оба из которых содержат метод с тем же именем и параметрами, но разные типы возврата? Например:
interface A {
public int foo();
}
interface B {
public double foo();
}
class C implements A, B {
public int foo() {...} // compilation error
}
Есть ли простой способ преодолеть эту проблему?
Ответы
Ответ 1
Самое простое решение - всегда возвращать double
в A, поскольку оно может хранить все возможные значения int
.
Если вы не выбрали вариант, вам нужно использовать альтернативу наследованию.
class C {
public A getA();
public B getB();
}
C c = new C();
int a = c.getA().foo();
double b = c.getB().foo();
Ответ 2
Вы не можете. Java однозначно идентифицирует методы по их имени и их параметрам, а не по их возврату.
Ответ 3
Вы можете написать класс Adapter для реализации одного из интерфейсов.
Пример реализации:
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(){...}
}
Ответ 4
Использовать номер вместо double и int в интерфейсах A и B.
Ответ 5
Метод в Java однозначно определяется его сигнатурой. Из http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
Определение. Два из компонентов объявления метода содержат подпись метода - имя метода и типы параметров.
Ответ 6
Ваш метод foo()
явно не определен. Вероятно, должен существовать родительский интерфейс с public Number foo()
, который расширен A и B, которые переопределяют это для более конкретного типа. Существует не очень разумный способ, которым ваш класс может реализовать оба этих интерфейса, если вы не переименуете один из методов foo
.