对类型别名的反思

时间:2013-06-04 03:07:17

标签: scala reflection types macros

如何将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]] ⇒

我明白了:

  • symOption
  • args.headMyType

如何通过反思将MyType扩展为List[Double]?我已经确定MyTypeList,但我无法获得嵌套类型参数Double


Scaladoc参考

TypeRef extractor

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

1 个答案:

答案 0 :(得分:4)

我认为normalize上的Type方法可以帮助您:

  

扩展类型别名并将更高级别的TypeRef转换为PolyTypes。   类型上的函数也实现为PolyTypes。例如:(在   下面是List的类型构造函数)TypeRef(pre,,List())是   替换为PolyType(X,TypeRef(pre,,List(X)))

拥有t类型,您也可以执行t.map(_.normalize)之类的操作。这将标准化t以及属于t定义的所有类型(例如类型参数)。这样就可以有效地消除t中任何地方出现的任何别名。