私は新しいscalaリフレクションAPIを掘り下げていますが、次のスニペットが期待どおりに機能しない理由を理解できません。与えられた階層(私ができる限り単純化しようとしました):
import scala.reflect.runtime.universe._
trait TF[A] {
implicit def t: TypeTag[A]
def f[T <: A: TypeTag]: PartialFunction[Any, A] = {
case msg: T if typeOf[T] =:= typeOf[A] => msg
}
}
class TFilter[T: TypeTag] extends TF[T] {
def t = typeTag[T]
}
case class Foo(x: Int)
f
与えられたタイプのオブジェクトをフィルタリングするメソッドを期待しています。したがって、次のスニペットはSeq[Foo]
val messages = Seq(1, "hello", Foo(1))
val tFilter = new TFilter[Foo]
messages collect tFilter.f[Foo]
そして、実際には返されますSeq[Foo]
が、他のメッセージはフィルタリングされていないため、バグのように聞こえます。
res1: Seq[Foo] = List(1, hello, Foo(1))
質問。私はTypeTag
間違って使用していますか、それとも新しいリフレクションAPIの欠陥ですか?
PS0。で試してみましScala 2.10.0-RC1
た2.10.0-RC2
PS1。回避策はに置き換えることTypeTag
です。Manifest
そのため、次のコードcollect
をシーケンスに使用するとList(Foo(1))
、期待どおりに返されます。
trait MF[A] {
implicit def m: Manifest[A]
def f[T <: A: Manifest]: PartialFunction[Any, A] = {
case msg: T if typeOf[T] =:= typeOf[A] => msg
}
}
class MFilter[T: Manifest] extends MF[T] {
def m = manifest[T]
}
更新Scala 2.10.0-RC2
:新しいリリースと同じです。