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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果扩展abstract方法中使用的参数,则覆盖方法中的参数类相关的知识,希望对你有一定的参考价值。

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

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

答案

如果您在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;
    }
}

以上是关于如果扩展abstract方法中使用的参数,则覆盖方法中的参数类的主要内容,如果未能解决你的问题,请参考以下文章

dubbo配置的覆盖关系

c#中virtual, abstract和override的区别和用法?

Java中接口和抽象类的区别?

c#中啥情况用abstract,啥情况下用virtual

JAVA之旅——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

虚方法与抽象方法有什么区别