有一些基类BaseA
具有延迟注入字段foo
(或不是惰性)。
public class BaseA {
@Inject
protected Provider<BaseY> foo;
void someMethod1(){
BaseY bar = foo.get();
//...using "bar"
}
}
类
BaseY
由类DerivedY
扩展:public class DerivedY extends BaseY{
}
基类
BaseA
由类DerivedA
扩展。如何在DerivedY
类中使用DerivedA
实例?第一种变体:
public class DerivedA extends BaseA {
@Inject
protected Provider<DerivedY> foo;
void someMethod2(){
DerivedY bar = foo.get();
//...using "bar"
}
}
但是在这种情况下,例如,FindBugs引发下一个违规“类定义的字段掩盖了超类字段(MF_CLASS_MASKS_FIELD)”。
第二变体:
public class DerivedA extends BaseA {
void someMethod2(){
DerivedY bar = (DerivedY)foo.get();
//...using "bar"
}
}
使用向下转换的第二变体查询违反了Liskov替换原则。
在这种情况下(最佳实践)哪种解决方案是正确的?您可以就此问题提供哪些文献(或链接)建议?
最佳答案
我建议研究generics。解决此问题的一种方法是使用通用基类。
public class BaseA<T extends BaseY> {
final Supplier<T> foo;
public BaseA(Supplier<T> foo) {
this.foo = foo;
}
}
public class DerivedA extends BaseA<DerivedY> {
public DerivedA(Supplier<DerivedY> foo) {
super(foo);
}
}