【发布时间】:2016-08-18 10:14:36
【问题描述】:
假设我需要一些DerivedBuilder 来扩展一些BaseBuilder。基础构建器有一些方法,如foo(返回BaseBuilder)。派生构建器具有方法bar。方法bar 应该在方法foo 之后调用。为了做到这一点,我可以像这样覆盖DerivedBuilder 中的foo 方法:
@Override
public DerivedBuilder foo() {
super.foo();
return this;
}
问题是BaseBuilder 有很多像foo 这样的方法,我必须覆盖它们中的每一个。我不想这样做,所以我尝试使用泛型:
public class BaseBuilder<T extends BaseBuilder> {
...
public T foo() {
...
return (T)this;
}
}
public class DerivedBuilder<T extends DerivedBuilder> extends BaseBuilder<T> {
public T bar() {
...
return (T)this;
}
}
但问题是我还是不会写
new DerivedBuilder<DerivedBuilder>()
.foo()
.bar()
尽管T 这里是DerivedBuilder。我该怎么做才能不覆盖很多功能?
【问题讨论】:
-
使用这种泛型方法,您可以致电:
new DerivedBuilder<DerivedBuilder>().foo().bar()。它将工作并首先执行foo,然后执行bar。如果你想调用BaseBuilder的更多方法,最后你想调用DerivedBuilder方法,那么这是不可能的,因为第二次,方法返回BaseBuilder的引用,这样你就不能调用DerivedBuilder' s 方法。 -
@Sandeep.KI 试图执行它并且编译器抱怨
bar没有在BaseBuilder中定义,因为那时我做了.foo().bar()在执行@987654351 之后编译器唯一知道T@ 是这个T扩展了BaseBuilder -
@user1803551 我不明白这如何解决我的问题。在您的链接中描述了一些方法来确保当我的问题是关于如何不显式调用它时调用超级方法。
-
他们解决了同样的问题,并且(其中一些)答案回答了您的问题。 “确保调用超级方法的某些方法”与“如何不显式调用它”之间没有矛盾 - 确保调用它可以在某种程度上不显式地完成,这就是那里的答案。跨度>
标签: java generics builder-pattern