Возврат объекта того же типа, что и вызывающая функция - PullRequest
1 голос
/ 04 июня 2019

У меня есть два класса, один расширяет другой.Большинство функций в родительском классе возвращают либо себя (после изменения объекта, вызвавшего функцию), либо новый объект того же типа.Предполагается, что дочерний класс разделяет эти функции, однако он должен возвращать объект дочернего типа.

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

Я провел поиск и нашел некоторые решения с использованием универсальных функций.Тем не менее, они либо нуждаются в дополнительном аргументе Class<T>, либо потенциально могут вызвать ошибку приведения типа.

Есть ли способ создать функцию в родительском классе, чтобы объект родительского или дочернего типа мог возвращать сам себя или объект того же типа?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

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

Если у вас есть специальный метод для создания нового экземпляра дочернего типа, вы можете использовать его во всех других ваших методах. Вам все равно придется переопределить этот один метод в каждом дочернем классе, но это лучше, чем переопределение каждого метода:

public abstract class Parent<T extends Parent<T>> {
  protected abstract T newInstance();

  public T doSomething() {
    T instance = newInstance();
    // do something with instance
    return instance;
  }

  public T doSomethingElse() {
    // do something with this
    return this;
  }
}

public class Child extends Parent<Child> {
  protected Child newInstance() {
    return new Child();
  }
}

Child.doSomething теперь возвращает Child без необходимости переопределения doSomething.

0 голосов
/ 04 июня 2019

Есть ли способ создать функцию в родительском классе, чтобы объект родительского или дочернего типа может возвращать себя или объект того же типа?

Да, с кастингом. Рассмотрим следующий пример:

public static void main(String[] args) {
    final Animal animal = new Dog();
    final Dog dog = animal.returnsChildType();
}

public static class Animal {

    public <T extends Animal> T returnsChildType() {
        return (T) this;
    }
}

public static class Dog extends Animal {

}
...