メソッドチェインと継承
Javaでメソッドチェインと継承を組み合わせて使ったとき、↓こういうのが困る。
public class Foo { public Foo foo() { return this; } } public class Bar extends Foo { public Bar bar() { return this; } } // 文法エラー // foo() は Foo を返すので、bar() が呼べない new Bar().foo().bar();
以下のように物凄く汚らしい感じで作ればそれなりに動作するんだけど、他にまともなやり方はないのだろうか。
public class Foo<T extends Foo<?>> { @SuppressWarnings("unchecked") protected T getThis() { return (T) this; } public static Foo<?> getInstance() { return new Foo<Foo<?>>(); } public T foo() { return getThis(); } } public class Bar<T extends Bar<?>> extends Foo<T> { public static Bar<?> getInstance() { return new Bar<Bar<?>>(); } public T bar() { return getThis(); } } public class Baz<T extends Baz<?>> extends Bar<T> { // 以下同じような感じ } // OK Bar.getInstance().foo().bar(); // OK new Bar<Bar<?>>().foo().bar(); // これはだめ new Bar().foo().bar();