目次
1.多相関数定義で見かける[+A]とは?
「+」記号は、型パラメータAが共変であることです。
そもそも共変とは何でしょうか?
ちなみに共変のほかに反変や非変というものがあります。
2.共変とは
型パラメータを持ったクラスA、型パラメータBとCがあったときにBがCを継承しているときにのみ以下のような代入が許される性質を持っています。
つまり、異なる型でも代入対象の型が代入元の型を継承していれば代入できるのです。
class C class B extends C B = C //OK
共変には制約があります。
それは共変は戻り値に設定できません。
しかし、この制約を解除できる条件がありますそれは「C >: B」を満たしていることです。
ちなみに「C >: B」などという表現が出てきますが、これはCはBの継承元を意味しております。
3.反変とは
これは共変の逆パターンの性質になります。
型パラメータを持ったクラスA、型パラメータBとCがあったときにBがCを継承しているときにのみ以下のような代入が許される性質を持っています。
class C class B extends C C = B //OK
反変を示す書き方は型パラメータの左側に「-」をつけてあげます。
つまり「-B」という感じです。
反変の制約は、これも共変と逆で引数に設定できないことです。
そして、この制約を解除する条件は「C <: B」を満たしていることです。
4.非変とは
型パラメータを持ったクラスAの型パラメータがBとCがあるとき、B=Cが成り立つときに代入が許されるという性質を持っています。
つまり型同士が一致しないと代入できないことです。
Scalaでは配列などが非変となっており、型同じでないとコンパイル時でエラーになります。
これに対して、Javaの配列では代入できてしまいます。
以上