Structual Subtyping

静的ダックタイピングのようなもの

「Tはxxメソッドを持っていればいい型」のようなことができる

ベター Generics です

object Foo { def name = "Foo" }
object Bar { def name = "Bar" }

object Main {
  def dispName(x :{def name: String}) = println(x.name)

  def main(args : Array[String]): Unit = {
    dispName(Foo)
    dispName(Bar)
  }
}
Foo
Bar


List などの型引数にも指定できる

object Foo { def name = "Foo" }
object Bar { def name = "Bar" }

object Main {
  def main(args : Array[String]): Unit = {
    val ls = List[{def name: String}](Foo, Bar)

    ls.foreach(x => println(x.name))
  }
}


type alias もできるので、こう書ける

object Foo { def name = "Foo" }
object Bar { def name = "Bar" }

object Main {
  type HasName = {def name: String} // nameを持ってる型

  def dispName(x: HasName) = println(x.name)

  def main(args : Array[String]): Unit = {
    val ls = List[HasName](Foo, Bar)

    ls.foreach(dispName)
  }
}