by shigemk2

当面は技術的なことしか書かない

抽象型

型パラメータに加えて指定できる型の一つ。

メンバでtypeキーワードによってクラスやトレイトのメンバを宣言し、そのクラスやトレイトを継承したクラスで具体的な型を宣言する。

// 抽象型を宣言した抽象クラスを宣言する
abstract class Base {
  // 宣言するだけで実際にこれがどの型なのかはまだ決まっていない
  type SomethingFoo
  def show(something:SomethingFoo)
}

class Foo {
  def exec = println("Foo#execを実行")
}

class Ex1 extends Base {
  // さっきの抽象型にFooクラスを指定する
  type SomethingFoo = Foo
  def show(something:SomethingFoo) = something.exec
}

object Type {
  def main(args: Array[String]) {
    val x = new Ex1
    println(x)
    x.show(new Foo) // Foo#execを実行
  }
}

めんどうなので

$ scalac type.scala && scala Type

で。