あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

構造的部分型(Structural Subtyping)

型の階層構造とは関係なく特定のメソッドを定義して、このメソッドを持つ型として定義できる。
Rubypython のダックタイピングと同じようなもの

戻り値の型が Unit で引数無しの close メソッドを持つ型を構造的部分型として指定

  def using[S <: { def close(): Unit }, U](s: S)(f: S => U): U = {
    try f(s) finally s.close
  }

scala では type の抽象型定義 で C の typedef と似たような抽象型を定義することができる
type Hoge = Foobar

抽象型に構造的部分型を定義することも可能

  type Closeable2 = { def close(): Unit }

  def using[S <: Closeable2, U](s: S)(f: S => U): U = {
    try f(s) finally s.close
  }

長さによって、短い場合は直接指定して長くなる場合は抽象型に定義するとよさそう。
簡単なインターフェースは構造的部分型を使う。