2016-05-17 74 views
0

后续代码:斯卡拉isInstanceOf [T]功能不能使用有界ClassTag/TypeTag

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

得到在编译以下:

Warning: abstract type T is unchecked since it is eliminated by erasure 
    case _ if a.isInstanceOf[T] => 

奇怪的是,如预期的情况下的匹配将工作。有没有办法让isInstanceOf [T]也知道ClassTag上下文绑定?

回答

3

我不会说这是按预期工作:

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

不要使用isInstanceOf,因为它不使用ClassTag s的一切。您可以使用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 
    } 
}