Интерфейс и наследование: "тип возврата 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
Как мне решить эту проблему?
Ответы
Ответ 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) {...}
}