In diesem Thread, ich bin eine einfache Helferfunktion für TraversableLike Schreiben:Scala TypeTag nicht daran hindert, vom Typ Erasure
How to specify a type parameter in calling a function while let the compiler infer the other?
ich implementieren die folgende Funktion:
implicit class TraversableLikeView[A, Repr](self: TraversableLike[A, Repr]) {
def filterByType[B: TypeTag] = new FilterByType[B]
class FilterByType[B: TypeTag] {
def get[That](implicit bf: CanBuildFrom[Repr, B, That]): That = {
val result = self.flatMap{
v =>
val unboxed = Utils.javaUnbox(v)
unboxed match {
case x: B => Some(x)
case _ => None
}
}(bf)
result
}
}
}
Die TypeTag wird verwendet, da ClassTag.unapply ein Problem bei der Verarbeitung primitiver Klassen hatte. Allerdings, wenn ich den obigen Code zu kompilieren bekam ich die folgende Warnung:
Warning:(304, 23) abstract type pattern B is unchecked since it is eliminated by erasure
case x: B => Some(x)
^
die gegen ist, was Anspruch TypeTag zu tun (ClassTag war eine fast perfekte Arbeit hier tun). Gibt es einen Grund, warum TypeTag in diesem Fall nicht funktioniert?
Ich dachte ClassTag bereits in neuester Scala Version ist veraltet und TypeTag ist der Nachfolger? Wofür ist TypeTag gut? – tribbloid
Nein, 'ClassTag' ist nicht veraltet. 'ClassManifest' ist und' ClassTag' ist sein Ersatz. –