有人能指出为什么默认接口方法不能为某个类实现的其他接口方法定义行为/实现吗?
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;
}
}发布于 2020-03-19 11:24:10
问题是,如果Transformable::quarter要更改为默认方法(从接口的角度来看应该是向后兼容的更改),则会导致钻石问题。这两种默认值中的哪一种会被选中?
当然,编译器不知道,所以最安全的事情是让编写实现的人解决问题,即使问题还不存在。通过使实现者解决歧义,Transformable::quarter可以在不破坏SomethingQuarterly的情况下在将来更改为默认方法。
如果这两个方法在概念上是相关的,并且Quarterly应该覆盖Transformable,那么您应该让Quarterly扩展该接口。
interface Quarterly extends Transformable {
//...
}发布于 2020-03-19 11:23:11
要使其工作,您的季度接口必须从可转换接口继承。因此,进行以下修改:
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类可以只实现季度接口。
https://stackoverflow.com/questions/60755995
复制相似问题