首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -默认接口方法不能作为其他接口方法的实现

Java -默认接口方法不能作为其他接口方法的实现
EN

Stack Overflow用户
提问于 2020-03-19 11:11:20
回答 2查看 58关注 0票数 2

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

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-19 11:24:10

问题是,如果Transformable::quarter要更改为默认方法(从接口的角度来看应该是向后兼容的更改),则会导致钻石问题。这两种默认值中的哪一种会被选中?

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

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

代码语言:javascript
复制
interface Quarterly extends Transformable {
    //...
}
票数 4
EN

Stack Overflow用户

发布于 2020-03-19 11:23:11

要使其工作,您的季度接口必须从可转换接口继承。因此,进行以下修改:

代码语言:javascript
复制
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类可以只实现季度接口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60755995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档