Ich graben neue Scala Reflexion API und kann nicht herausfinden, warum das folgende Snippet nicht wie erwartet funktioniert. Angesichts Hierarchie (versucht, so viel zu vereinfachen, wie ich kann):Scala 2.10 TypeTag Verwendung
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)
Ich erwarte Methode f
auf Objekte von bestimmtem Typ zu filtern. So sollte die folgenden Ausschnitt zurückkehren Seq[Foo]
val messages = Seq(1, "hello", Foo(1))
val tFilter = new TFilter[Foo]
messages collect tFilter.f[Foo]
Und es gibt tatsächlich Seq[Foo]
aber mit anderen Meldungen ungefiltert, was wie ein Fehler klingt.
res1: Seq[Foo] = List(1, hello, Foo(1))
Frage. Benutze ich TypeTag
falsch oder es ist Defekt der neuen Reflexion API?
PS0. Versucht mit Scala 2.10.0-RC1
und 2.10.0-RC2
PS1. Die Problemumgehung besteht darin, TypeTag
durch Manifest
zu ersetzen, sodass mit dem folgenden Code collect
on sequence wie erwartet List(Foo(1))
zurückgegeben wird.
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]
}
aktualisieren: Samt mit neuer Scala 2.10.0-RC2
Release.
Es könnte hilfreich sein, um die Warnung Sie 'Fall msg erhalten hinzuzufügen: T' im Code:' Warnung: abstrakten Typ T in Art Muster T nicht markiert ist, da es durch Löschen beseitigt ". Ich sehe diese Warnung nicht mit dem alten 'Manifest'-Ansatz. – Steve
@ Som-Snytt, denke, es ist * graben *. Mangel an Englisch üben. Ich werde versuchen, beim nächsten Mal vorsichtiger zu sein :) – 4e6