如果扩展abstract方法中使用的参数,则覆盖方法中的参数类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果扩展abstract方法中使用的参数,则覆盖方法中的参数类相关的知识,希望对你有一定的参考价值。
假设我有以下四个classess,其中两个是抽象的,两个是具体的:Abstract1
,Concrete1
,Abstract2
,Concrete2
。
Concrete1
扩展Abstract1
和Concrete1
扩展Abstract1
。
假设我有以下四个classess,其中两个是抽象的,两个是具体的:AbstractProp
,ConcreteProp
,AbstractClass
,ConcreteClass
。
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
中参数的类(ConcreteProp
和setProperty()
)不同,使得@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方法中使用的参数,则覆盖方法中的参数类的主要内容,如果未能解决你的问题,请参考以下文章
c#中virtual, abstract和override的区别和用法?
JAVA之旅——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展