以下は、Scala2.9ではだめでScala2.10限定です
*1 *2
implicit class RichAny[A](val self: A) extends AnyVal{ def as[B <: A : Manifest]: Option[B] = self match { case x: B => Some(x) case _ => None } }
ちょっとC# っぽい(?)
使い方は以下のような感じ
scala> class A defined class A scala> class B extends A defined class B scala> val b: A = new B b: A = B@42bab86d scala> b.as[B] res0: Option[B] = Some(B@42bab86d)
もうちょっと工夫のやりようがありそうなので、なにか思いついたらだれか教えて下さい。
(
*1:単にvalue classやimplicit classが問題ではなく、Manifest渡して、その型をそのまま使ってのパターンマッチが2.9では無理
*2: manifestのerasure呼べば、2.9以前でもほぼ同じことはできますが http://stackoverflow.com/a/10323892/605582