java - 如果方法中参数的类扩展了抽象方法中使用的参数的类,则覆盖方法中参数的类

标签 java inheritance overriding abstract-class

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

Concrete1 扩展 Abstract1Concrete2 扩展 Abstract2

假设我有以下四个类,其中两个是抽象的,两个是具体的: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;
    }
}

但这最后一段代码无效,因为 setProperty() 中参数的类(AbstractPropConcreteProp)不同,使 @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;
    }
}

关于java - 如果方法中参数的类扩展了抽象方法中使用的参数的类,则覆盖方法中参数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53575402/

相关文章:

java - 在不使用媒体提取器的情况下,无法在 Android 4.2 上对视频进行低级解码

java - Spring 框架将 Connection 对象传递给遗留代码

c++ - 单个继承的派生类的大小

.net - Form_Load() 'event' 或覆盖 OnLoad()

java - 阻止 objectweb asm 用 throw 替换无法访问的代码

java - 将数据集中的映射类型映射到列

c++ - 访问基类对象中的 protected 成员

javascript - Javascript (ES6) 中的静态变量继承

python - 使用 PySide 覆盖 paintEvent 的问题

c++ - 仅针对模板中的某些类型覆盖函数