Java - метод интерфейса по умолчанию не может выступать в качестве реализации для другого метода интерфейса - PullRequest
2 голосов
/ 19 марта 2020

Может ли кто-нибудь указать мне причину, по которой методы интерфейса по умолчанию не могут определить поведение / реализацию для других методов интерфейса, реализованных определенным классом, пожалуйста?

interface Transformable {
    int quarter();
    BigDecimal value();
}

interface Quarterly {

    int getQuarter();

    void setQuarter(int quarter);

    // Method that I would expect to be used to define Transformable method behavior
    default int quarter() {
        return getQuarter();
    }
}

// expects quarter() implementation
static class SomethingQuarterly implements Quarterly, Transformable {

    private int quarter;
    private BigDecimal value;

    @Override
    public int getQuarter() {
        return quarter;
    }

    @Override
    public void setQuarter(int quarter) {
        this.quarter = quarter;
    }

    @Override
    public BigDecimal value() {
        return value;
    }
}

Ответы [ 2 ]

4 голосов
/ 19 марта 2020

Проблема в том, что если Transformable::quarter измениться на метод по умолчанию, который должен быть обратно совместимым изменением с точки зрения интерфейса, это вызовет проблему алмаза . Какое из двух значений по умолчанию будет выбрано?

Компилятор, конечно, не знает, и поэтому самое безопасное - заставить человека, пишущего реализацию, решить проблему , даже если проблема еще не существует Заставив разработчика разрешить неоднозначность, Transformable::quarter может в будущем перейти на метод по умолчанию, не нарушая SomethingQuarterly.

Если два метода концептуально связаны и Quarterly должен переопределить Transformable, вы Quarterly должен расширить этот интерфейс.

interface Quarterly extends Transformable {
    //...
}
1 голос
/ 19 марта 2020

Чтобы это работало, ваш Квартальный интерфейс должен наследоваться от Преобразуемого интерфейса. Таким образом, сделайте следующую модификацию:

interface Quarterly extends Transformable {

    int getQuarter();

    void setQuarter(int quarter);

    // Method that I would expect to be used to define Transformable method behavior
    default int quarter() {
        return getQuarter();
    }
}

После этого ваш класс SomethingQuarterly может реализовать только интерфейс Quarterly.

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