2016-05-17 8 views

答えて

3

予想通り、私はこれが働いていると言うではないでしょう。それがすべてでClassTag Sを使用しないよう

scala> (new Foo[String] {}).v(List(1)) 
res10: Any = Some(List(1)) // Not a String! 

は、isInstanceOfを使用しないでください。代わりに、ClassTag抽出器を使用することができます。

abstract class Foo[T: ClassTag] { 
    def v(a: Any) = a match { 
     case _: T => Some(a) 
     case _ => None 
    } 
} 

scala> (new Foo[String] {}).v(1) 
res3: Option[Any] = None 

scala> (new Foo[String] {}).v("abc") 
res4: Option[Any] = Some(abc) 

はこれがために、すべてのシンタックスシュガーです:

abstract class Foo[T](implicit ct: ClassTag[T]) { 
    def v(a: Any) = a match { 
     case ct(a) => Some(a) 
     case _ => None 
    } 
}