[Scala]パラメータ化された型について(<:とか)

クラスに型パラメータを追加

class クラス名[型パラメーター, …]

定義例

class Sample[T] {
  protected var t: T = _

  def set(in: T): Unit = {
    this.t = in
  }

  def get(): T = {
   t
  }
}

使い方

val s = new Sample[String]
s.set("abc")
val v = s.get()

型パラメーターの境界(<:とか>:とか)

クラスの定義と継承が以下のような状態の場合に

class A1
class A2 extends A1
class A3 extends A2

型パラメータで

class Sample[T <: A2]

とすると

new Samle[Any] //=> ×
new Samle[A1] //=> ×
new Samle[A2] //=> ○
new Samle[A3] //=> ○
new Samle[Nothing] //=> ○

逆に

class Sample[T >: A2]

とすると

new Samle[Any] //=> ○
new Samle[A1] //=> ○
new Samle[A2] //=> ○
new Samle[A3] //=> ×
new Samle[Nothing] //=> ×

となる

上限と下限を両方指定も出来る

class Sample[T >: A3 <: A1]

この場合は

new Samle[Any] //=> ×
new Samle[A1] //=> ○
new Samle[A2] //=> ○
new Samle[A3] //=> ○
new Samle[Nothing] //=> ×

Scala>:,<:,型パラメータ

Posted by GENDOSU