我在这里有两个界面:
public interface Configuration {
}
public abstract interface Configurable {
public Configurable setConfig(Configuration config);
}
当我的一个实现尝试覆盖setConfig()
方法时,编译器会抱怨它不会覆盖超类方法。
// This is not correct.
@Override
public SubConfigurable setConfig(SubConfiguration config) {
this.config = config;
return this;
}
我知道我总是可以传入一个Configuration对象并转换为它的真实类型,但我想知道是否有更好的方法来定位它。或者我可能只是一个错误的设计方法?
提前致谢。
答案 0 :(得分:3)
可以使接口具有通用性,使用泛型类型参数指定配置类型,并使用上限。
public interface Configurable<C extends Configuration> {
public Configurable setConfig(C config);
}
然后子类可以指定需要哪个Configuration
。
public class SubConfigurable implements Configurable<SubConfigurable> {
@Override
public SubConfigurable setConfig(SubConfiguration config) {
this.config = config;
return this;
}
}
返回类型不需要这样做,因为Java返回类型是协变的。子类可以返回原始方法的子类型,并仍然覆盖该原始方法。覆盖方法中的参数类型不是协变的,但以这种方式使用泛型是一种有效的解决方案。
答案 1 :(得分:0)
看看Java Generics。此外,java接口不必隐式声明为abstract,它已经是抽象的。