【问题标题】:Reflection on type aliases对类型别名的反思
【发布时间】:2013-06-04 15:55:54
【问题描述】:

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

【问题讨论】:

    标签: scala reflection types macros


    【解决方案1】:

    我认为Type 上的normalize 方法可能会对您有所帮助:

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

    拥有t 类型,您还可以执行t.map(_.normalize) 之类的操作。这将规范化 t 以及属于 t 定义的所有类型(例如类型参数)。因此,这将有效地消除出现在 t 中的任何别名。

    【讨论】:

    • 正是我所需要的。谢谢!
    猜你喜欢
    • 2011-07-22
    • 2020-11-21
    • 2015-03-22
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    相关资源
    最近更新 更多