あなたがタグを入力するためのマニフェストからかなり直訳をしたい場合、あなたはそれを使用し、適切なミラーを取得する必要がありますインスタンスを反映させて、<:<
をType
に設定してください。たとえば:
今
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]
)
そして:
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))
あり、あなたのアプリケーションでは、より完全に新しいリフレクションAPIを利用することができな方法かもしれないが、これは動作するはずですし、非推奨の世話をします警告。
非常に役に立ちました!しかし、実際に私のプロジェクトでこれを試してみると、次のランタイムエラーが発生します:class LineStringを含む不正な循環参照(scala.reflect.internal.Symbols $ TypeSymbol.tpe(Symbols.scala:2710))もちろん、問題の特定のクラスに関連しています。 –