如何为动态类型与声明类型不同的 class 字段编写 getter?

How can I write a getter for a class field whose dynamic type is different from declared type?

我在工作中遇到了如下情况,正在寻求更好的解决方案。有一个 BaseClass,它的一个字段被声明为 FieldBaseClass 类型。该字段在子 classes 中实例化,然后具有动态类型 FieldChildClass。我想为 return 是子 class (FieldChildClass) 而不是父实例的字段写一个 getter。如何在不进行类型转换的情况下实现它?

我试过将 getter 放入子 class 并将 return 类型转换为特定的子 class,但这看起来很难看。

BaseClass.java

public class BaseClass {

   protected FieldBaseClass field;

   public BaseClass() {
      field = calculateFieldValue();
   }

   public static class FieldBaseClass {
       protected String bar = "bar";
   }
}

ChildClass.java

public class ChildClass extends BaseClass {

   public FieldChildClass calculateFieldValue() {
       return new FieldChildClass("foo");
   }


   public static class FieldChildClass extends FieldBaseClass {
      private String foo;

      public FieldChildClass(String foo) {
         this.foo = foo;
      }
   }

   public FieldChildClass getField() {
      return (FieldChildClass) field;
   }
} 

我认为这不可能。基本上,当该字段已声明类型时,您所能做的就是尝试将其隐藏,例如 here。但我不确定这是否适合您的需求。

我认为如果不进行类型转换,您将无法做到这一点。

您可以使用 generic type 例如T定义字段的类型。

public class BaseClass<T extends FieldBaseClass> {
  protected T field;

  public T getField() {
    return field;
  } 
}

public class ChildClass extends BaseClass<FieldChildClass> {

}

这将使您能够:

ChildClass c = new ChildClass();
FieldChildClass f = c.getField();