Используемый мной автомаппер, AutoMatter , допускает наследование, например,
@AutoMatter
public interface BaseClass {
Foo foo();
Bar bar();
}
@AutoMatter
public interface DerivedClass extends BaseClass {
Baz baz();
}
, но его сгенерированные компоновщики не являются полиморфными, , т. Е. они
@Generated("io.norberg.automatter.processor.AutoMatterProcessor")
public final class DerivedClassBuilder {
private Foo foo;
private Bar bar;
private Baz baz;
public DerivedClassBuilder() {}
private DerivedClassBuilder(DerivedClass v) {
this.foo = v.foo();
this.bar = v.bar();
this.baz = v.baz();
}
private DerivedClassBuilder(DerivedClassBuilder v) {
this.foo = v.foo;
this.bar = v.bar;
this.baz = v.baz;
}
// (getters and setters for the builder)
public DerivedClass build() {
// ...
}
public DerivedClassBuilder from(DerivedClass v) {
return new DerivedClassBuilder(v);
}
public DerivedClassBuilder from(DerivedClassBuilder v) {
return new DerivedClassBuilder(v);
}
// a few more things like hash(), equals(), etc.
}
То, что мне нужно, но там нет, есть
public DerivedClassBuilder from(BaseClass v) {
// ...
}
Это означает, например, если у меня много общих полей в базовом классе, нонесколько различных производных классов, мне нужно в какой-то момент построить все общие поля вручную например
DerivedClassBuilder builder = new DerivedClassBuilder();
builder.foo(foo);
builder.bar(bar);
builder.baz(baz);
вместо того, чтобы делать
DerivedClassBuilder builder = new DerivedClassBuilder(baseClassBuilder);
builder.baz(baz);
.... что, в первую очередь, несколько разрушает цель наследования.
Если я вынужден использовать эту библиотеку, есть ли шаблон, который может помочь мне обобщить этот бит?
Я поиграл с добавлением статического вспомогательного метода в базовый интерфейс, используя обобщенные элементы, чтобы попытаться представить любой производный класс, но я, похоже, застрял из-за стирания типа.И нет ничего лучше, чем derivedClass.BuilderType
, чтобы помочь мне, даже если я пытаюсь использовать библиотеку пересекающихся при копировании, например, Dozer.
По общему признанию, я новичок в Java, поэтому я думаю, что либо я упускаю что-то очевидное,или просто невозможно делать то, что я хочу, учитывая строителей, которые не имеют никакого отношения друг к другу.