構造的部分型(Structural Subtyping)
型の階層構造とは関係なく特定のメソッドを定義して、このメソッドを持つ型として定義できる。
Ruby や python のダックタイピングと同じようなもの
戻り値の型が 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 }
長さによって、短い場合は直接指定して長くなる場合は抽象型に定義するとよさそう。
簡単なインターフェースは構造的部分型を使う。