[英]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.