У меня есть родительский класс Builder
, который можно сгенерировать с помощью параметра типа Builder
или его подтипа:
class Builder<T extends Builder> {
@SuppressWarnings("unchecked")
T doSmth() {
System.out.println("do smth");
return (T)this;
}
}
Имеет подкласс - BuilderChild
:
class BuilderChild extends Builder<BuilderChild> {
BuilderChild doSmthElse() {
System.out.println("do smth else");
return this;
}
}
Итак, я могу вызвать метод doSmth
на экземпляре BuilderChild
и он вернет BuilderChild
:
new BuilderChild().doSmth().doSmthElse();
Но когда я попытался сгенерировать BuilderChild
, строка выше перестала компилироваться.
class BuilderChild<T> extends Builder<BuilderChild> {
BuilderChild doSmthElse() {
System.out.println("do smth else");
return this;
}
}
...
//Compile error, because doSmth()
//returns Builder instead of BuilderChild.
new BuilderChild().doSmth().doSmthElse();
Может кто-нибудь объяснить, почему doSmth()
начал возвращать Builder
после того, как я обобщил BuilderChild
? Есть ли способы исправить это?