質問: JavaのPECSについての質問です。 以下のブログ?を参考にしています。 http://qiita.com/pebblip/items/1206f866980f2ff91e77 以下のインターフェースを考える。 ``` //型Tの値を消費する関数 interface Consumer { void apply(T value); } //型Tの値をもつコンテナ interface Box { //保持する値を返す T get(); //値を設定する void put(T element); //別のコンテナの値を設定する void put(Box box); //Consumer関数を適用する void applyConsumer(Consumer function); } ``` 次に以下のコードについて考える。 ``` public void foo(Box intBox, Consumer intConsumer, Consumer numConsumer) { intBox.applyConsumer(intConsumer); //OK intBox.applyConsumer(numConsumer); //コンパイルエラー } ``` 「Integer型の要素を消費する Consumer 型の関数を適用できるにもかかわらず、Number型の要素を消費するConsumer の関数を適用できないのは直感に反している。」 とのことですが、直感に反しているでしょうか。 これを直感に反していると思えないのです。 「直感」ですので、説明するのは難しいかもしれませんが、どのように考えれば直感に反するのでしょうか。 回答お願いします。
回答: オブジェクト指向の基本ルールの一つに、リスコフの置換原則(LSP; Liskov Substitution Principle)と呼ばれるものがあり、簡単に言ってしまえば「子クラスは親クラスとして扱えるべき」という法則です。今回の例であれば「`Integer`型インスタンスを`Number`型として扱えること」を意味します。 この考え方を拡張すると「`Consumer`型の代わりに`Consumer`型を渡しても良いのでは?」という"直感"になる、という論法でしょう。たぶん。 (私を含む大多数には)PECS原則はよく考えれば確かにねという類のルールでしょうから、特に違和感を持たれなかったのであれば問題ないと思いますよ。