public static class Parent {
private int field1;
public static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
private int field1;
protected B $fillValuesFrom(final C instance) {
ParentBuilderImpl.$fillValuesFromInto(instance, this);
return self();
}
}
private static final class ParentBuilderImpl extends ParentBuilder<Parent, ParentBuilderImpl> {
private static void $fillValuesFromInto(Parent instance, ParentBuilder<?,?> b) {
b.field1(instance.field1);
}
}
public ParentBuilder<?, ?> toBuilder() {
return new ParentBuilderImpl().$fillValuesFrom(this);
}
}
public static class Child extends Parent {
private double field2;
public static abstract class ChildBuilder<C extends Child, B extends ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {
private double field2;
protected B $fillValuesFrom(final C instance) {
super.$fillValuesFrom(instance);
ChildBuilderImpl.$fillValuesFromInto(instance, this);
return self();
}
}
private static final class ChildBuilderImpl extends ChildBuilder<Child, ChildBuilderImpl> {
private static void $fillValuesFromInto(Parent instance, ParentBuilder<?,?> b) {
b.field2(instance.field2);
}
}
public ChildBuilder<?, ?> toBuilder() {
return new ChildBuilderImpl().$fillValuesFrom(this);
}
}