Как я могу написать геттер для поля класса, динамический тип которого отличается от объявленного типа? - PullRequest
0 голосов
/ 14 мая 2019

Я столкнулся со следующей ситуацией на работе, и я ищу лучшее решение.Существует BaseClass, и одно из его полей объявлено типа FieldBaseClass.Поле создается в дочерних классах и имеет динамический тип FieldChildClass.Я хочу написать метод получения для поля, которое возвращает экземпляр дочернего класса (FieldChildClass), а не родительского.Как я могу добиться этого без необходимости приведения типа?

Я попытался поместить getter в дочерний класс и привести тип возвращаемого значения к определенному дочернему классу, но это выглядит ужасно.

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;
   }
} 

Ответы [ 2 ]

4 голосов
/ 14 мая 2019

Вы можете использовать универсальный тип , например. 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();
0 голосов
/ 14 мая 2019

Я не думаю, что это будет возможно.Обычно, когда в поле объявлен тип, все, что вы можете сделать, это попытаться скрыть его, как описано, например, здесь .Но я не уверен, что это подойдет Вашим потребностям.

Не думаю, что Вы можете сделать это иначе без приведения типов.

...