前の記事では、サブタイピング機能を備える静的型付け言語につきものの、抽象度が高く難しい概念「反変」と「共変」について解説しました。この記事では、前回の記事を書く動機となった気づきについてお話します。最初に前提として「反変」と「共変」を組み合わせた概念である「不変」を紹介し、その上で「不変」であることによって発覚した、その「気づき」について解説します。 不変: 関数の引数として受け取り、かつ戻り値として返す場合 ある型の型引数が、関数の戻り値であれば共変になり、関数の引数であれば反変になるということは、型引数が関数の戻り値と引数両方で使用されていた場合はどうなるでしょうか。そうした場合は「不変」となり、型引数に渡す型が全く同じでなければサブタイプ・スーパータイプの関係が成立しなくなります。文字通り「不変」なのです。 早速例を挙げましょう: // 型変数Tを関数の戻り値と引数両方に使用している