Saya sedang menggali api refleksi scala baru dan tidak tahu mengapa cuplikan berikut tidak berfungsi seperti yang diharapkan. Hirarki yang diberikan (mencoba menyederhanakan sebanyak yang saya bisa):
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)
Saya mengharapkan metode f
untuk memfilter objek dengan tipe tertentu. Jadi cuplikan berikut akan mengembalikan Seq[Foo]
val messages = Seq(1, "hello", Foo(1))
val tFilter = new TFilter[Foo]
messages collect tFilter.f[Foo]
Dan itu sebenarnya mengembalikan Seq[Foo]
tetapi dengan pesan lain tanpa filter, yang terdengar seperti bug.
res1: Seq[Foo] = List(1, hello, Foo(1))
Pertanyaan. Apakah saya menggunakan TypeTag
salah atau cacat pada api refleksi baru?
PS0. Mencoba dengan Scala 2.10.0-RC1
dan 2.10.0-RC2
PS1. Solusinya adalah mengganti TypeTag
dengan Manifest
, sehingga dengan kode berikut collect
secara berurutan akan mengembalikan List(Foo(1))
seperti yang diharapkan.
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]
}
Pembaruan: Sama dengan rilis Scala 2.10.0-RC2
baru.
case msg: T
di kode Anda:warning: abstract type T in type pattern T is unchecked since it is eliminated by erasure
. Saya tidak melihat peringatan ini dengan pendekatanManifest
yang lama. - person Steve   schedule 05.11.2012