我正在使用的自动映射器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) {
// ...
}
这意味着,例如,如果我在基类中有许多公共字段,但是有几个不同的派生类,则我必须在某个时候手动构建所有公共字段,例如 eg
DerivedClassBuilder builder = new DerivedClassBuilder();
builder.foo(foo);
builder.bar(bar);
builder.baz(baz);
无法做到
DerivedClassBuilder builder = new DerivedClassBuilder(baseClassBuilder);
builder.baz(baz);
...从一开始就破坏了继承的目的。
如果我被限制使用该库,是否有一种模式可以帮助我对此位进行泛化?
我一直在尝试在基本接口中添加静态助手方法,使用泛型尝试表示任何派生类,但是由于类型擦除,我似乎陷入了困境。即使我尝试使用像Dozer这样的复制相交库,也没有derivedClass.BuilderType
可以帮助我。
诚然,我是Java的新手,所以我认为我遗漏了一些显而易见的东西,或者鉴于给定的构建器彼此之间没有任何关系,根本不可能做我想做的事。