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

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).

Или, если нет, как бы вы обходились?

Спасибо!

4b9b3361

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