【发布时间】:2017-12-14 22:06:25
【问题描述】:
我可以覆盖具有协变返回类型的方法,但是是否可以覆盖具有协变返回类型的默认方法?在下面的示例中,我想覆盖 getFirstLeg 而不重写默认方法,但 Java 不允许这样做。我也不想让 Animal 成为一个通用接口,因为可能有很多参数,而且 Animal 用在很多地方。
interface Leg {
}
interface Animal {
List<? extends Leg> getLegs();
default Leg getFirstLeg() {
return getLegs().get(0);
}
}
abstract class AnimalImpl<T extends Leg> implements Animal {
private List<T> legs;
@Override
public List<T> getLegs() {
return legs;
}
}
interface DuckLeg extends Leg {
}
interface Duck extends Animal {
@Override
List<? extends DuckLeg> getLegs(); //covariant return type
@Override
DuckLeg getFirstLeg(); //I do not want to rewrite this method
}
class DuckImpl extends AnimalImpl<DuckLeg> implements Duck {
//Error: java: DuckImpl is not abstract and does not override abstract method getFirstLeg() in Duck
}
更新:以下代码可以编译,但新问题是 Duck 不再是 Animal。
interface Leg {
}
interface AnimalGeneric<T extends Leg> {
List<? extends T> getLegs();
default T getFirstLeg() {
return getLegs().get(0);
}
}
abstract class AnimalImpl<T extends Leg> implements AnimalGeneric<T> {
private List<T> legs;
@Override
public List<T> getLegs() {
return legs;
}
}
interface Animal extends AnimalGeneric<Leg> {
//empty
}
interface BirdLeg extends Leg {
}
interface BirdGeneric<T extends BirdLeg> extends AnimalGeneric<T> {
}
class BirdImpl<T extends BirdLeg> extends AnimalImpl<T> implements BirdGeneric<T> {
}
interface Bird extends BirdGeneric<BirdLeg> {
//empty
}
interface DuckLeg extends BirdLeg {
}
class DuckImpl extends BirdImpl<DuckLeg> implements Duck {
}
interface Duck extends BirdGeneric<DuckLeg> {
}
【问题讨论】:
标签: java default-method covariant-return-types