2014-09-05 158 views
1

我有一个Scala(2.10)def宏,参数为x。它的机身看起来是这样的:匹配Scala宏中的泛型类型

if (x.actualType =:= typeOf[generic.Type[String]]) { 
    // branch 1: do something with x 
} 
else { 
    // branch 2: do something else 
} 

generic.Type类本身的实现是不可访问及其执行不能修改。现在,我想让这个宏调用分支1,而不仅仅是为generic.Type [String] s,而是generic.Type [T],其中T是任何类型。

有没有规范的方法来实现这一目标?或者是使用AST手动执行的唯一选择?

+0

什么是宏签名? – Ashalynd 2014-09-05 15:26:54

+0

它是def impl(c:Context)(x:c.Expr [Any]):c.Expr [Any] – fishlips 2014-09-05 15:56:06

回答

2

尝试x.actualType.typeSymbol == typeOf[generic.Type[_]].typeSymbol

+0

类型表示Scala类型,例如'Foo [Bar]'或者甚至像'Foo forSome {键入Bar <:Baz}'。符号表示Scala定义(每个定义只有一个与其关联的符号)。因此,检查某些东西(例如某种类型的组件)是否涉及某种定义的正确方法是比较符号。 – 2014-09-06 13:41:27