假设我有以下四个类,其中两个是抽象的,两个是具体的:Abstract1
,Concrete1
,Abstract2
,Concrete2
。
Concrete1
扩展了Abstract1
,而Concrete1
扩展了Abstract1
。
假设我有以下四个类,其中两个是抽象的,两个是具体的: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
注释无效。有没有办法可以使用通用和/或通配符来完成我要在这里完成的工作?
注意::我知道这种命名方式是错误的做法,并且代码过于简单化,我并未真正使用它,这只是一个使问题尽可能简单的示例可能。
答案 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;
}
}