1

如何将 a 扩展为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]反射扩展?我已经能够确定它MyType是 a List,但我无法获得嵌套类型参数Double


Scaladoc 参考资料

TypeRef 提取器

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

1 回答 1

4

我认为normalize方法Type可以帮助你:

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

拥有一个类型t,您还可以执行类似t.map(_.normalize). 这将规范化t以及作为定义的一部分的所有类型t(例如类型参数)。因此,这将有效地消除任何出现在t.

于 2013-06-04T07:55:54.263 回答