2012-12-11 4 views
9

Kann mir jemand zeigen, was ich unter Scala 2.10 an Stelle dieses veralteten Typzeugnisses in Manifest tun sollte?Veraltete Version ersetzen <: <Zeuge vom Manifesttyp in Scala 2.10

Ehrlich gesagt, ist mein Ziel hier nur, es durch etwas zu ersetzen, das keine Verwarnungswarnung auslöst. Ich bin glücklich, die neue Reflektions-API zu verwenden.

Hier ist der Code in Frage in Zusammenhang, ob das wichtig ist:

https://github.com/azavea/geotrellis/blob/master/src/main/scala/geotrellis/feature/op/geometry/geometry.scala#L45

Antwort

10

Wenn Sie eine ziemlich wörtliche Übersetzung von Manifesten wollen Tags eingeben, werden Sie den entsprechenden Spiegel erhalten müssen, verwenden Sie es um Ihre Instanz zu reflektieren, und verwenden Sie dann die <:< on Type. Zum Beispiel:

import scala.reflect.runtime.currentMirror 
import scala.reflect.runtime.universe._ 

sealed trait X 
case class Y(i: Int) extends X 
case class Z(j: String) extends X 

def filterX[A <: X: TypeTag](xs: List[X]) = xs.filter(
    x => currentMirror.reflect(x).symbol.toType <:< typeOf[A] 
) 

Und jetzt:

scala> filterX[Z](List(Y(1), Y(2), Z("test"))) 
res1: List[X] = List(Z(test)) 

scala> filterX[Y](List(Y(1), Y(2), Z("test"))) 
res2: List[X] = List(Y(1), Y(2)) 

Es kann Möglichkeiten geben Sie die Vorteile des neuen Reflection-API ausführlicher in Ihrer Anwendung übernehmen könnten, aber dies sollte arbeiten und Pflege der deprecation nehmen Warnungen.

+0

Sehr hilfreiche Antwort! Aber wenn ich das in meinem Projekt tatsächlich versuche, erhalte ich den folgenden Laufzeitfehler: illegaler zyklischer Verweis mit der Klasse LineString (at scala.reflect.internal.Symbols $ TypeSymbol.tpe (Symbols.scala: 2710)) Das ist natürlich wahrscheinlich nur in Bezug auf die spezifischen Klassen in Frage. –