Załóżmy, że potrzebuję jakiegoś DerivedBuilder
do rozszerzenia niektórych BaseBuilder
. Podstawowy program budujący ma pewną metodę, taką jak foo
(która zwraca BaseBuilder
). Wyprowadzony konstruktor ma metodę bar
. Metoda bar
powinna zostać wywołana po metodzie foo
. W tym celu należy go mogę zastąpić foo
metodę w DerivedBuilder
tak:Generic Java Generator
@Override
public DerivedBuilder foo() {
super.foo();
return this;
}
Problemem jest to, że BaseBuilder
ma wiele sposobów, takich jak foo
i muszę zastąpić każdą z nich. Nie chcę, aby to zrobić, więc starałem się używać rodzajowych:
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;
}
}
Ale problemem jest to, że nadal nie można napisać
new DerivedBuilder<DerivedBuilder>()
.foo()
.bar()
Nawet T
tutaj jest DerivedBuilder
. Co mogę zrobić, aby nie zastąpić wielu funkcji?
Z tego approch generyków, można zadzwonić: 'nowy DerivedBuilder(). foo(). bar() '. To zadziała i uruchomi najpierw 'foo', a potem' bar'. Jeśli chcesz wywołać więcej metod 'BaseBuilder' i wreszcie chcesz wywołać metodę' DerivedBuilder', to nie jest to możliwe, ponieważ po raz drugi metoda zwraca referencję 'BaseBuilder', z tym nie możesz nazwać' DerivedBuilder'' s metoda. –
@ Sandeep.KI próbował tego dokonać, a kompilator narzekał, że 'bar' nie został zdefiniowany w' BaseBuilder' ponieważ wtedy robię '.foo(). Bar()' jedyny kompilator wie o 'T' po wykonaniu' foo 'jest to, że to' T' rozszerza 'BaseBuilder' – PepeHands
Zobacz [this] (http://stackoverflow.com/questions/4217013/how-to-force-derived-class-to-call-super-method-like-android -does) i [this] (http://stackoverflow.com/questions/6853638/require-override-of-method-to-call-super) i [this] (http://stackoverflow.com/questions/6142460/how-do-i-force-a-polimorficzne wywołanie-super-metody) ... – user1803551