Java:使用参数类型的子类实现Setter方法?

时间:2014-04-03 00:00:39

标签: java

我在这里有两个界面:

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对象并转换为它的真实类型,但我想知道是否有更好的方法来定位它。或者我可能只是一个错误的设计方法?

提前致谢。

2 个答案:

答案 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,它已经是抽象的。