1

型ファミリがあるとします。基本型で一連のメソッドを定義しました。

interface Foo<T> {
   Foo<T> a();
   Foo<T> b();
   ...
}

そしてBar伸びるFoo

interface Bar<T> extends Foo<T> {
   Bar<T> a();
   Bar<T> b();
   ...
}

そして、Zee伸ばしますBar

interface Zee<T> extends Bar<T> {
   Zee<T> a();
   Zee<T> b();
   ...
}

この型ファミリをさまざまなデコレータで実装すると、次のようなものを常に書いていることがわかりました

class XBar<T> extends XFoo<T> implements Bar<T> {
   Bar<T> a() {
      return (Bar<T>)super.a();
   }
   Bar<T> b() {
      return (Bar<T>)super.b();
   }
   ...
}

本当に面倒です。Java API 設計におけるこの通常のケースなのか、何か間違ったことをしたのか、1 行のコードで定数の型キャストを回避するスマートな方法があるのだろうか?

更新、あなたのコメントと応答に答えるために、はい、メソッドチェーンは私がここで達成したいことの1つです. ところでBaseStream、Java8 の型宣言は、この問題に対処する良い例のようです。私はそのアプローチを使用しようとしています。ここで私の進捗状況を更新します。

更新 2、複数の継承レベルがある場合、このBaseStreamアプローチは機能しません。複数レベルの階層で Java が継承した Fluent メソッドの戻り値の型を参照してください。

4

1 に答える 1