Scala 关于类型别名的思考

Scala 关于类型别名的思考,scala,reflection,types,macros,Scala,Reflection,Types,Macros,如何将TypeRef扩展到别名的原始类型(和类型参数)的类型别名 如果我有一个类型引用了选项[List[Double]],我会: case myType @ TypeRef(_, sym, args) if myType <:< typeOf[Option[Any]] ⇒ case myType @ TypeRef(_, sym, args) if myType <:< typeOf[Option[Any]] ⇒ 我明白了: sym是选项 args.headisMy

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

如果我有一个类型引用了
选项[List[Double]]
,我会:

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

  • sym
    选项
  • args.head
    is
    MyType
如何通过反射将
MyType
扩展到
List[Double]
?我已经能够确定
MyType
是一个
列表
,但是我无法获取嵌套类型参数
Double


Scaladoc参考文件

:


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

展开类型别名并将更高种类的TypeRef转换为多类型。 类型上的函数也实现为多类型。例:(在 下面是列表的类型构造函数)TypeRef(pre,,List())是 替换为PolyType(X,TypeRef(前,列表(X)))


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

中任何地方出现的任何别名,我认为
类型上的
规范化
方法可能会帮助您:

展开类型别名并将更高种类的TypeRef转换为多类型。 类型上的函数也实现为多类型。例:(在 下面是列表的类型构造函数)TypeRef(pre,,List())是 替换为PolyType(X,TypeRef(前,列表(X)))


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

中出现的任何别名,这正是我所需要的。谢谢正是我需要的。谢谢
TypeRef(
  pre: Universe.Type,
  sym: Universe.Symbol,
  args: List[Universe.Type])