У меня проблема с примером кода ниже:
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
?