有一些基类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);
    }
}

08-03 16:44