書籍「Kotlinイン・アクション」を読んで個人的に疑問に思った点や調べたことについて記載する読書記録です。
書籍の内容については記載しません。
第9章の内容
第9章 ジェネリクス
https://book.mynavi.jp/ec/products/detail/id=78137
ジェネリクスの注意点
- ジェネリッククラスの型パラメータTは通常Any?型でnull許容型であることに注意
- null非許容型にするためには上限限界を指定する必要がある
class Hoge<T : Any>{
・・・
}
不変
不変の説明が理解しづらかったので、整理。
2つの異なる型A,Bについて、MutableList<A>がMutableList<B>のサブタイプ、スーパータイプではない場合にMutableListは型パラメータについて不変である。
MutableList<Int>はMutableList<Any>としては使えない
ことを不変という。
IntはAnyのサブタイプだが、MutableListはMutableListのサブタイプではないというのがポイント。
不変の逆が共変。
ListはListとして使えるため共変。
ジェネリクスを共変にする
ジェネリクスの中で型引数のスーパータイプ、サブタイプの関係を維持するにはout
キーワードを明示的に指定して共変にする必要がある。
outキーワード
out
キーワードを指定した型パラメータTは戻り値としてしか使えないよう制限できる。これによって、共変の安全性を保証することができる。
反変
型パラメータのサブタイプの関係と逆になることを反変という。
HogeがHogeのサブタイプの場合、IntはNumberのサブタイプであるという関係と逆になっているため、反変という。
in
キーワードを使った場合には反変する。