Java: Вызов метода супертипа не использует реализацию этого подтипа. - PullRequest
1 голос
/ 19 июня 2020

У меня проблема с примером кода ниже:

public abstract class PetBuilder<T extends PetBuilder<T>> {

  String name;
  int age;

  public T name(String name) { this.name = name; }
  public T age(String age) { this.age = age; }

  public T copy(Pet pet) {
    this.name = pet.name;
    this.age = pet.age;
  }

  public abstract Pet build();

}

public class CatBuilder extends PetBuilder<CatBuilder> {

  String color;

  public CatBuilder color(String color) { this.color = color; }  

  @Override
  public CatBuilder copy(Cat cat) {
    super.copy(cat);
    this.color = cat.color;
    return this;
  }

  @Override
  public Cat build() {
    return new Cat(this);
  }

}

public abstract class Pet {

  protected String name;
  protected int age;

  Pet(PetBuilder builder) {
    this.name = builder.name;
    this.age = builder.age;
  }

  public abstract PetBuilder builder();

  public Pet withAge(int age) {
    return this.builder().copy(this).age(age).build();
  }

}

public class Cat extends Pet {

  private String color;

  Cat(CatBuilder builder) {
    super(builder);
    this.color = color;
  }

  @Override
  public CatBuilder builder() { return new CatBuilder(); }

  @Override
  public Cat withAge(int age) {
    return (Cat) super.withAge(age);
  }

}

Когда я выполняю следующий код:

Cat felix = new CatBuilder().age(5).name("Felix").color("black").build();
felix = felix.withAge(6);

, я получаю экземпляр Cat ( felix), цвет которого null, а не «черный».

При проверке с помощью отладчика кажется, что метод copy() класса CatBuilder никогда не вызывается, даже если базовый объект, возвращенный this.builder() - это экземпляр CatBuilder.

Есть ли способ заставить эту работу работать, чтобы мне не приходилось дублировать все методы withSomething() в дочерних классах Pet?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...