Подтвердить что ты не робот

Конфликтные методы интерфейса в Java

Возможный дубликат:
Идентификация имени метода в реализации интерфейса - Java

Что нам делать, если нам нужно реализовать два интерфейса, оба из которых содержат метод с тем же именем и параметрами, но разные типы возврата? Например:

interface A {
    public int foo();
}

interface B {
    public double foo();
}

class C implements A, B {
    public int foo() {...}  // compilation error
}

Есть ли простой способ преодолеть эту проблему?

4b9b3361

Ответ 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.