В scala размышлении, как разрешить конкретный тип элемента? - PullRequest
0 голосов
/ 09 января 2020

У меня есть программа, которая может выдавать абстрактный TypeTag при выполнении:

class TypeResolving extends FunSpec {

  import org.apache.spark.sql.catalyst.ScalaReflection.universe._

  val example = new Example

  it("can convert") {

    val t1 = implicitly[TypeTag[example.T]]
    println(t1)
  }
}

object TypeResolving {

  class Example {

    type T = Map[String, Int]
  }
  val example = new Example
}

Результат выполнения:

TypeTag[TypeResolving.this.example.T]

Так как в этом случае example.T уже определено, Я также хотел бы получить актуальный TypeTag:

TypeTag[Map[String,Int]]

Как мне туда добраться?

1 Ответ

2 голосов
/ 10 января 2020

Попробуйте dealias

def dealias[T, T1](typeTag: TypeTag[T]): TypeTag[T1] = backward(typeTag.tpe.dealias)

val typeTag = implicitly[TypeTag[TypeResolving.example.T]] //TypeTag[TypeResolving.example.T]
val typeTag1 = dealias(typeTag) //TypeTag[scala.collection.immutable.Map[String,Int]]

val typeTag2 = implicitly[TypeTag[Map[String, Int]]] //TypeTag[Map[String,Int]]
val typeTag3 = dealias(typeTag2) //TypeTag[scala.collection.immutable.Map[String,Int]]

typeTag1 == typeTag3 //true

Как получить псевдоним типа псевдоним типа в scala время выполнения?

Получить TypeTag из типа? (backward отсюда)

...