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

Интерфейс и наследование: "тип возврата int несовместим"

public interface MyInterface{
    public int myMethod();
}


public class SuperClass {
    public String myMethod(){
        return "Super Class";
    }
}

public class DerivedClass extends SuperClass implements MyInterface {
    public String myMethod() {...}  // this line doesn't compile 
    public int myMethod() {...}     // this is also unable to compile
}

Когда я пытаюсь скомпилировать DerivedClass, он дает мне ошибку

java: myMethod() in interfaceRnD.DerivedClass cannot override myMethod() in interfaceRnD.SuperClass
  return type int is not compatible with java.lang.String

Как мне решить эту проблему?

4b9b3361

Ответ 1

Ошибка возникает из-за того, что вызов myMethod будет неоднозначным - какой из двух методов следует вызывать? Из JLS §8.4.2:

Ошибка компиляции для объявления двух методов с эквивалентными эквивалентами в классе.

Возвращаемый тип метода не является частью его подписи, поэтому вы получаете ошибку в соответствии с вышеприведенным утверждением.

Предполагая, что вы не можете просто переименовать конфликтующие методы, вы не можете использовать наследование в этом случае, и вам нужно будет использовать альтернативу, например composition:

class DerivedClass implements MyInterface {

    private SuperClass sc;

    public String myMethod1() {
        return sc.myMethod();
    }

    public int myMethod() {
        return 0;
    }

}

Ответ 2

У вас не может быть два метода с одной и той же сигнатурой, но с разными типами возвращаемых данных.

Это связано с тем, что компилятор не может знать, какой метод вы пытаетесь вызвать, когда выполняете object.myMethod();.

Ответ 3

Перегрузка метода дифференцируется по их параметру. Здесь myMethod() как в интерфейсе, так и в суперклассе имеет аналогичную сигнатуру параметра. Поэтому вы не можете этого сделать.

Ответ 4

У вас не может быть 2 метода с одной и той же сигнатурой, но с разными типами возвращаемых данных. Если это возможно, это не может быть определено, когда был вызван метод.

Кстати, все методы в интерфейсе public и abstract.

public interface MyInterface{
 int myMethod();
}

Что вы можете сделать, это иметь интерфейс с входным параметром, это называется overloading

Пример:

        public interface MyInterface{
         String myMethod(String param);
        }
        and in your class

        public class DerivedClass extends SuperClass implements MyInterface{


        public String myMethod(){ ...}  
        public String myMethod(String param) {...}   
       }