簡體   English   中英

Java - 默認接口方法不能作為其他接口方法的實現

[英]Java - default interface method cannot act as implementation for other interface method

有人能指出我為什么默認接口方法不能為某個類實現的其他接口方法定義行為/實現嗎?

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;
    }
}

問題是,如果Transformable::quarter更改為默認方法(從接口的角度來看應該是向后兼容的更改),則會導致菱形問題 會選擇兩個默認值中的哪一個?

編譯器當然不知道,所以最安全的做法是讓編寫實現的人解決問題,即使問題還不存在。 通過讓實現者解決歧義, Transformable::quarter可以在將來更改為默認方法而不會破壞SomethingQuarterly

如果這兩個方法在概念上相關並且Quarterly應該覆蓋Transformable ,那么您應該讓Quarterly擴展該接口。

interface Quarterly extends Transformable {
    //...
}

要使其工作,您的 Quarterly 接口必須繼承自 Transformable 接口。 因此,進行以下修改:

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 接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM