2016-04-01 10 views
1

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?

Antwort

1

Dies wird nur durch ClassTag unterstützt, weil Sie einen Class von ihm bekommen können, und Sie können in der Regel eine Class von einem TypeTag bekommen nicht : z.B. In Makros ist die Klasse noch nicht kompiliert. Aber vermutlich sind Sie scala.reflect.runtime.universe.TypeTag, in dem Fall, dass Sie schreiben können

implicit val classTagB = ClassTag[B](mirror.runtimeClass(typeTag[B].tpe)) 
+0

Ich dachte ClassTag bereits in neuester Scala Version ist veraltet und TypeTag ist der Nachfolger? Wofür ist TypeTag gut? – tribbloid

+0

Nein, 'ClassTag' ist nicht veraltet. 'ClassManifest' ist und' ClassTag' ist sein Ersatz. –

Verwandte Themen