● 概要
JDK 1.5以降で導入された共変戻り値型によって、名前と引数が同じだが無関係なメソッドのオーバーライドが可能になっている。
● 状況
共変戻り値型が使える場合、図のようなオーバーライドが可能である。
前提は
+ あるインターフェイス(図ではInterfaceX)が、自身を戻り値型とするメソッド(図ではmethod(...): InterfaceX)を持つ。
+ あるインターフェイスないしクラス(図ではSuperclassA)が、自身を戻り値型とするメソッド(図ではmethod(...): SuperclassA)を持つ。
+ これらのメソッドmethod(...)は、名前と引数(その数と型と並び順)が一致する。
さらに、SuperclassAがInterfaceXを継承もしくは実装しているなら、SuperclassAを継承したクラスのメソッドmethod(...)は自動的に、InterfaceX#method(...): InterfaceXとSuperclassA#method(...):SuperclassAの両方をオーバーライドしたものになる。
一方、SuperclassAがInterfaceXを継承・実装しておらず無関係な場合、SuperclassAを継承したクラス(図ではClassB)がInterfaceXを実装しようとすると、2つのメソッドmethod(...)の戻り値型が整合せず、コンパイルできない。
この状況で、ClassBがメソッドmethod(...)を共変戻り値型によりmethod(...): ClassBとしてオーバーライドすれば、これはInterfaceX#method(...): InterfaceXとSuperclassA#method(...):SuperclassAの両方をオーバーライドしたものになる。
つまり、名前と引数が同じだが無関係なメソッドのオーバーライドが可能である。
※ この方法に名前はある?
※ この方法と関係するデザインパターンはある?
※ この方法を使って無関係な2つのメソッド(InterfaceX#method(...): InterfaceXとSuperclassA#method(...):SuperclassA)に共通の実装を与えるのが妥当な状況があるとして、これらの2つのメソッドに予め関係を与えておくことはできる?そこに意味はある?