对类型别名的反思



如何将TypeRef扩展为类型别名的原始类型(和类型参数)?

如果我有一个类型指向Option[List[Double]],我这样做:

case myType @ TypeRef(_, sym, args) if myType <:< typeOf[Option[Any]] ⇒

:

  • symOption
  • args.headList[Double],我可以继续处理Double类型。

使用类型别名

如果我有一个类型Option[MyType]和别名type Mytype = List[Double],我这样做:

case myType @ TypeRef(_, sym, args) if myType <:< typeOf[Option[Any]] ⇒

我得到这个:

  • sym is Option
  • args.headMyType

如何用反射将MyType扩展到List[Double] ?我已经能够确定MyTypeList,但我无法获得嵌套类型参数Double


参Scaladoc

TypeRef器:

TypeRef(
  pre: Universe.Type,
  sym: Universe.Symbol,
  args: List[Universe.Type])

我认为normalize方法对Type可能有帮助:

展开类型别名并将更高类型的TypeRefs转换为多类型。类型上的函数也被实现为PolyTypes。例:in the下面是List)的类型构造函数typeperef (pre,, List()) is由PolyType(X, TypeRef(pre,, List(X)))代替

有一个类型t,你也可以做一些像t.map(_.normalize)。这将规范t以及t定义中的所有类型(例如类型参数)。因此,这将有效地摆脱任何别名出现在t的任何地方。

相关内容

  • 没有找到相关文章

最新更新