トレイトなりクラスなりを継承するときに, 親の型パラメータの継承関係を引き継ぐかどうかを指定するのが変位指定アノテーション.

  • 共変: 継承関係を引き継ぐ
  • 非変: 継承関係を引き継がない
  • 反変: 継承関係を反転させる

もはや反変に関しては, どんなときに欲しくなるのかよくわからないので置いとく(反転するだけで共変と同じだし).

class Animal
class Human extends Animal
class Anotation1[T](val arg: T)   // 非変
class Anotation2[+T](val arg: T)  // 共変

とクラスを定義しておいて,

val animal = new Animal()
val human = new Human()

val ano1Human = new Anotation1[Human](human)
val ano2Human = new Anotation2[Human](human)

このとき,

val inst1: Animal = human

これは, 親子関係だから親の型の変数に代入できる

val inst2: Anotation1[Animal] = ano1Human

これは, Anotation1を非変で定義したので, 型エラーを吐かれる

val inst3: Anotation2[Anumal] = ano2Human

共変なので, 代入できる

次は Scala ⑤ パターンマッチ