クラスAbstractInterruptibleChannelは、InterruptibleChannelとそのスーパーインタフェースチャネルの両方を実装します。このクラスが2つのインターフェイスを実装する理由(共通の親から既に拡張されているインターフェイス)
これには何らかの理由がありますか?
またはこれの利点は何ですか?あなたが正しい
クラスAbstractInterruptibleChannelは、InterruptibleChannelとそのスーパーインタフェースチャネルの両方を実装します。このクラスが2つのインターフェイスを実装する理由(共通の親から既に拡張されているインターフェイス)
これには何らかの理由がありますか?
またはこれの利点は何ですか?あなたが正しい
が、これは実際には冗長です。
これを行う唯一の理由は、サブインターフェイスが将来のポイントで変更されて、他のインターフェイスを拡張しなくなることが懸念されるからです。
明示的に両方のインターフェイスを置くことで、その変更から保護されます(そして、そのクラスは両方のインターフェイスで "implements"と言います)。
しかし、これはやや珍しい、驚くべき構成ですが、私が使用するものは何もありません。
動作は同じです。
私は、インターフェイスが間接的に実装されていることを理解するために、absractクラスの定義に入る必要のない開発者向けの情報だと思います。
AbstractInterruptibleChannel
は、シャネル(Channel
)と割り込み可能なもの(InterruptibleChannel
)の2つです。両方のインタフェースを宣言すると明示的に強調されます。
カスタムクラスの場合、冗長で無力に見えるかもしれませんが、ソースコードがブラウズされ、何百万回も読み込まれるjdkクラスの場合、おそらくそうではありません。
これは、JDK実装全体を通して行われている、文書化されていない規約です。例えば、 'AbstractList'はすでに' List'の実装であると宣言されていますが、 'ArrayList'は' AbstractList'を拡張し、 'List'を実装します。アイデアは、もし誰かが 'implements ...'部分を親クラスから削除すると、1つ以上の子クラスが明示的に1つ以上のインタフェースの実装を削除する必要があるため、コンパイル時エラーがスローされるようです。 – manish
わかりやすくするために、IMO –