子类化(通用)构建器的子类
Subclassing a subclass of a (generic) builder
我正在尝试实现具有多级继承的构建器对象。我从 Subclassing a Java Builder class 中获得了一些灵感,这是我的(简化的)代码:
public class Whosebug {
public static class Builder<T extends Builder<T>> {
public Builder() {}
public T doA() {
System.out.println("A");
return (T) this;
}
}
public static class BuilderSubclass <T extends BuilderSubclass<T>>
extends Builder<BuilderSubclass<T>> {
public BuilderSubclass() {}
public T doB() {
System.out.println("B");
return (T) this;
}
}
public static class BuilderSubclassSubclass
extends BuilderSubclass<BuilderSubclassSubclass> {
public BuilderSubclassSubclass() {}
public BuilderSubclassSubclass doC() {
System.out.println("C");
return this;
}
}
}
我想做这样的事情:
new Whosebug.BuilderSubclassSubclass().doA().doC().doB()
但是,当我调用 new Whosebug.BuilderSubclassSubclass().doA()
时,返回的对象不是 BuilderSubclassSubclass
,而是 BuilderSubclass<BuilderSubclassSubclass>
。我知道为什么会这样:Builder
的泛型类型是 BuilderSubclass<BuilderSubclassSubclass>
,它在 BuilderSubclass
的 class 签名中分配。
关于如何避免这个问题有什么想法吗?
更新:我想我可以避免使用构建器模式,而是像这样调用函数:
Whosebug.BuilderSubclassSubclass builder = new Whosebug.BuilderSubclassSubclass();
builder.doA();
builder.doB();
builder.doC();
在这种情况下,代码变为:
public class WhosebugBatchHelperFunctions {
public static class Builder {
public Builder() {
}
public void doA() {
System.out.println("A");
}
}
public static class BuilderSubclass extends Builder {
public BuilderSubclass() {
super();
}
public void doB() {
System.out.println("B");
}
}
public static class BuilderSubclassSubclass extends BuilderSubclass {
public BuilderSubclassSubclass() {
super();
}
public void doC() {
System.out.println("C");
}
}
}
不过我认为这还不够"pretty",所以我仍然希望看到最初问题的答案。
您应该将 public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<BuilderSubclass<T>>
替换为 public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<T>
。
我正在尝试实现具有多级继承的构建器对象。我从 Subclassing a Java Builder class 中获得了一些灵感,这是我的(简化的)代码:
public class Whosebug {
public static class Builder<T extends Builder<T>> {
public Builder() {}
public T doA() {
System.out.println("A");
return (T) this;
}
}
public static class BuilderSubclass <T extends BuilderSubclass<T>>
extends Builder<BuilderSubclass<T>> {
public BuilderSubclass() {}
public T doB() {
System.out.println("B");
return (T) this;
}
}
public static class BuilderSubclassSubclass
extends BuilderSubclass<BuilderSubclassSubclass> {
public BuilderSubclassSubclass() {}
public BuilderSubclassSubclass doC() {
System.out.println("C");
return this;
}
}
}
我想做这样的事情:
new Whosebug.BuilderSubclassSubclass().doA().doC().doB()
但是,当我调用 new Whosebug.BuilderSubclassSubclass().doA()
时,返回的对象不是 BuilderSubclassSubclass
,而是 BuilderSubclass<BuilderSubclassSubclass>
。我知道为什么会这样:Builder
的泛型类型是 BuilderSubclass<BuilderSubclassSubclass>
,它在 BuilderSubclass
的 class 签名中分配。
关于如何避免这个问题有什么想法吗?
更新:我想我可以避免使用构建器模式,而是像这样调用函数:
Whosebug.BuilderSubclassSubclass builder = new Whosebug.BuilderSubclassSubclass();
builder.doA();
builder.doB();
builder.doC();
在这种情况下,代码变为:
public class WhosebugBatchHelperFunctions {
public static class Builder {
public Builder() {
}
public void doA() {
System.out.println("A");
}
}
public static class BuilderSubclass extends Builder {
public BuilderSubclass() {
super();
}
public void doB() {
System.out.println("B");
}
}
public static class BuilderSubclassSubclass extends BuilderSubclass {
public BuilderSubclassSubclass() {
super();
}
public void doC() {
System.out.println("C");
}
}
}
不过我认为这还不够"pretty",所以我仍然希望看到最初问题的答案。
您应该将 public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<BuilderSubclass<T>>
替换为 public static class BuilderSubclass<T extends BuilderSubclass<T>> extends Builder<T>
。