1

以下代码:

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 上下文绑定?

4

1 回答 1

4

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

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

不要使用isInstanceOf,因为它根本不使用ClassTags。您可以使用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
    }
}
于 2016-05-17T00:33:58.440 回答