ScalaのGenerics
variance指定アノテーション
ジェネリックな型Gen[T]のサブタイプ関係
P型とその派生型 (derived type)C型を考えたとき、Gen[P]とGen[C]はサブタイプ関係が保たれるのかどうかという問題
covariant
Gen[+T]として宣言する
このときPとCの関係と同様に
Gen[C]はGen[P]の派生型 (derived type)になる
例
code:scala
class List+A ..
// ListPにList[C[を代入できる
animals: ListP = List(C@51da6868)
contravariant
にするためにはGen[-T]として宣言する
このときPとCの関係とは逆転して
Gen[P]がGen[C]の派生型 (derived type)になる
invariant
Scalaの文脈では「非変」と呼ぶことが多いっぽいmrsekut.icon
にするためには普通にGen[T]として宣言する
このときGen[C]とGen[P]の間にはサブタイプ関係はない
例
code:scala
class ArrayT ..
Array[P]とArray[C]は互いに代入できない
型境界
https://qiita.com/f81@github/items/7a664df8f4b87d86e5d8#型境界
『実践Scala入門』 p.109
https://blog.j5ik2o.me/entry/20101106/1289028031
https://stackoverflow.com/q/663254