【问题标题】:Java - default interface method cannot act as implementation for other interface methodJava - 默认接口方法不能作为其他接口方法的实现
【发布时间】:2020-03-19 11:11:20
【问题描述】:

有人能指出默认接口方法不能为某个类实现的其他接口方法定义行为/实现的原因吗?

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

【问题讨论】:

    标签: java java-8 interface


    【解决方案1】:

    问题在于,如果Transformable::quarter 更改为默认方法,从接口的角度来看,这应该是向后兼容的更改,则会导致the diamond problem。会选择两个默认值中的哪一个?

    编译器当然不知道,所以最安全的做法是让编写实现的人解决问题即使问题还不存在。通过让实现者解决歧义,Transformable::quarter 可以在将来更改为默认方法而不会破坏SomethingQuarterly

    如果这两个方法在概念上是相关的并且Quarterly 应该覆盖Transformable,则应该使Quarterly 扩展该接口。

    interface Quarterly extends Transformable {
        //...
    }
    

    【讨论】:

    • 好的@Michael,当您指出向后兼容性时,我想您已经澄清了。一个可能的 Transformable::quarter 默认稍后实现会破坏“客户”。
    【解决方案2】:

    要使其工作,您的 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 接口。

    【讨论】:

    • 正如@Michael 所说,这只是一个解决方案,以防您在接口之间存在概念关系。事实并非如此。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 2014-12-06
    • 2019-11-14
    • 1970-01-01
    • 2016-06-16
    • 2019-03-03
    • 2021-11-01
    • 2014-12-03
    相关资源
    最近更新 更多