如果扩展了抽象方法中使用的参数的类,则重写方法中的参数的类

时间:2018-12-01 21:56:40

标签: java inheritance override abstract-class

假设我有以下四个类,其中两个是抽象的,两个是具体的:Abstract1Concrete1Abstract2Concrete2

Concrete1扩展了Abstract1,而Concrete1扩展了Abstract1

假设我有以下四个类,其中两个是抽象的,两个是具体的:AbstractPropConcretePropAbstractClassConcreteClass

ConcreteProp扩展了AbstractProp,而ConcreteClass扩展了AbstractClass

AbstractClass的代码如下:

public abstract class AbstractClass {
    protected AbstractProp someProperty;

    public abstract void setProperty(AbstractProp someProperty);
}

在实现ConcreteClass时,我希望能够做这样的事情(请记住AbstractProp扩展了`ConcreteProp):

public class ConcreteClass extends AbstractClass {
    @Override
    public void setProperty(ConcreteProp someProperty) {
        this.someProperty = someProperty;
    }
}

但是最后一段代码无效,因为AbstractProp中的参数类别(ConcretePropsetProperty())不同,从而使@Override注释无效。有没有办法可以使用通用和/或通配符来完成我要在这里完成的工作?

注意::我知道这种命名方式是错误的做法,并且代码过于简单化,我并未真正使用它,这只是一个使问题尽可能简单的示例可能。

1 个答案:

答案 0 :(得分:1)

如果在AbstractClass上引入泛型,则可以实现您所要求的。

public abstract class AbstractClass<T extends AbstractProp> {
    protected T someProperty;

    public void setProperty(T someProperty) {
        this.someProperty = someProperty;
    }
}

然后在ConcreteProp中指定您希望ConcreteClass成为您想要的类型。

public class ConcreteClass extends AbstractClass<ConcreteProp> {

    @Override
    public void setProperty(final ConcreteProp someProperty) {
        this.someProperty = someProperty;
    }
}