如何将TypeRef
扩展为类型别名的原始类型(和类型参数)?
如果我有一个类型指向Option[List[Double]]
,我这样做:
case myType @ TypeRef(_, sym, args) if myType <:< typeOf[Option[Any]] ⇒
我:
-
sym
为Option
-
args.head
是List[Double]
,我可以继续处理Double
类型。
使用类型别名
如果我有一个类型Option[MyType]
和别名type Mytype = List[Double]
,我这样做:
case myType @ TypeRef(_, sym, args) if myType <:< typeOf[Option[Any]] ⇒
我得到这个:
-
sym
isOption
-
args.head
是MyType
如何用反射将MyType
扩展到List[Double]
?我已经能够确定MyType
是List
,但我无法获得嵌套类型参数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
的任何地方。