Java: расширение класса и реализация интерфейса, который имеет тот же метод
Возможно, следующее невозможно сделать (я получаю ошибку компиляции: "Унаследованный метод A.doSomthing(int) не может скрыть публичный абстрактный метод в B" ):
public class A {
int doSomthing(int x) {
return x;
}
}
public interface B {
int doSomthing(int x);
}
public class C extends A implements B {
//trying to override doSomthing...
int doSomthing(int x) {
return doSomthingElse(x);
}
}
Предполагая, что мне разрешено изменять ни A, ни B, мой вопрос в том, можно ли каким-то образом определить C таким образом, чтобы он наследовал как от A, так и от B (предположим, что для некоторой структуры требуется, чтобы C было одновременно экземпляр A и B).
Или, если нет, как бы вы обходились?
Спасибо!
Ответы
Ответ 1
сделать общедоступный метод
public class C extends A implements B {
//trying to override doSomthing...
public int myMethod(int x) {
return doSomthingElse(x);
}
}
методы интерфейса всегда public
или просто используйте композицию вместо наследования
Ответ 2
Метод doSomethis()
package-private в классе A:
public class A {
int doSomthing(int x) { // this is package-private
return x;
}
}
Но это интерфейс public в интерфейсе B:
public interface B {
int doSomthing(int x); // this here is public by default
}
Компилятор берет doSomething()
, унаследованный от C из A, который является закрытым пакетом, как реализация того, что является публичным. Вот почему он жалуется -
"Унаследованный метод A.doSomthing(int) не может скрыть публичный абстрактный метод в B"
Поскольку, переопределяя метод, вы не можете сузить уровень доступа метода.
Решение легко, в классе C -
@Override
public int doSomthing(int x) {
// ...
}
Ответ 3
Это связано с видимостью. Вы используете default
(без модификатора) видимость в C
для myMethod
, но это должно быть public
в соответствии с интерфейсом B
.
Теперь вы можете подумать, что вы использовали видимость default
для всех из них, поскольку ни в A
, B
, ни C
вы явно не выбрали один из public
, private
или protected
. Однако интерфейс использует public
независимо от того, явно ли вы это указали.
Ответ 4
Простое выполнение метода public
при переопределении его в C
.