2

TypeTagTypeRef、およびの 3 つの異なるクラスがすべてユニバースにバインドされていますType。なぜ3つすべてが必要なのですか?しかない場合、またはTypeに変換するにはどうすればよいですTypeTagTypeRef?

たとえば、Scala リフレクション API 関数を介して共通のスーパー タイプを取得しました。

val at = ...some TypeTag...
val bt = ...some TypeTag...

val tpe = ScalaReflection.universe.lub(List(at.tpe, bt.tpe))
ScalaReflection.universe.(tpe)

またはに変換するにはどうすればよいですTypeTagTypeRef?

4

1 に答える 1

0

TypeRefの特定のケースですType:

abstract type TypeRef >: Null <: Universe.TypeRefApi with Universe.Type 

Typeaが実際に a であるかどうかはTypeRef、パターン マッチングで確認できます。

tpe match {
  case TypeRef(prefix, sym, args) =>
  // or alternately
  case typeRef: TypeRef =>
}

TypeTag[A]Typeは、 1) さまざまなミラーで機能するものにアクセスする方法です。2) 型パラメータからコンパイラによって自動的に生成できます (Typeジェネリックではないことに注意してください)。

に変換するTypeTypeTagは、TypeTag を手動で作成するには? :

import scala.reflect.runtime.universe._

def typeToTypeTag[T](
  tpe: Type,
  mirror: reflect.api.Mirror[reflect.runtime.universe.type]
): TypeTag[T] = {
  TypeTag(mirror, new reflect.api.TypeCreator {
    def apply[U <: reflect.api.Universe with Singleton](m: reflect.api.Mirror[U]) = {
      assert(m eq mirror, s"TypeTag[$tpe] defined in $mirror cannot be migrated to $m.")
      tpe.asInstanceOf[U#Type]
    }
  })
}
于 2016-06-05T08:43:33.510 に答える