斯卡拉isInstanceOf [T]功能不能使用有界ClassTag/TypeTag
问题描述:
后续代码:斯卡拉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上下文绑定?
答
我不会说这是按预期工作:
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
}
}