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.
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. –