如果扩展abstract方法中使用的参数,则覆盖方法中的参数类

问题描述 投票:1回答:1

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

Concrete1扩展Abstract1Concrete1扩展Abstract1

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

ConcreteProp扩展AbstractPropConcreteClass扩展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注释无效。有没有办法可以完成我在这里尝试做的事情,也许使用泛型和/或通配符?

注意:我知道这种类型的命名是不好的做法,代码过于简单,我实际上并没有使用它,这只是一个让问题尽可能简单的例子。

java inheritance override abstract-class
1个回答
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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.