【きょうへんせいとはんへんせい】
共変性と反変性 とは?
最終更新:
💡 「親子関係がコンテナにも伝わるか?」型安全の奥にある継承のルール。
📌 このページのポイント
- 共変性:子の型を親の型として扱える(出力側で使う)
- 反変性:親の型を子の型として扱える(入力側で使う)
- 不変性:そのままでしか使えない(多くのジェネリクスのデフォルト)
- JavaScriptのメソッドの引数は共変・反変の両方が混在しうる
`List` って `List` として渡せないの? Cat は Animal なのに!
それが型安全の落とし穴なんだ。もし `List` を `List` として使えると、「Dogを追加する」操作もできてしまって、Catしか入っていないはずのリストが壊れてしまうよ。
じゃあ共変性ってどういうときに使えるの?
読み取り専用のとき(出力側)は安全に使えるんだ。`Producer` を `Producer` として扱うのはOKだよ。Cat を返すものは Animal を返すものとして使えるからね。Kotlinでは `out` キーワードで指定するよ。
反変性っていうのは逆なの?
そうだよ。書き込み専用のとき(入力側)は反変性が使えるんだ。`Consumer` を `Consumer` として使えるよ。Animal を受け取れるものは当然 Cat も受け取れるから安全なんだ。Kotlinでは `in` キーワードを使うね。
不変性っていうのが一番厳しいの?
📖 おまけ:英語の意味
「Covariance and Contravariance」 = 共変性と反変性
💬 co- は「一緒に」contra- は「反対に」という意味の接頭辞で、型パラメータの変化が元の型の継承方向と同じか逆かを表しているんだよ。