我的resultType
类型为Context.this.type#c#universe#Type
。我需要将它与Unit
类型匹配。我试过了
resultType match {
case q"Unit" => ...
}
但我认为Unit
只是一个字符串文字,显然不匹配。如何通过quasiqotes匹配类型?
我也试过
resultType match {
case TypeRef(ThisType(_), Symbol("scala.Unit"), _) => ...
}
但有错误:
[error] pattern type is incompatible with expected type;
[error] found : Symbol
[error] required: Context.this.c.universe.SymbolContextApi
如何以这种方式匹配某个类型?
答案 0 :(得分:6)
Quasiquotes在这种情况下不起作用的主要原因是你不能在Tree
而不是Type
上匹配。这两个是反射API的单独概念,它们并不完全相同。
检查类型是否与您期望的类型相同的一种简单方法是使用typeOf
并键入相等运算符=:=
:
case tpe if tpe =:= typeOf[Unit] =>
当然这不是唯一的方法。也可以通过TypeRef
进行匹配,并检查其中的符号是否相等,如其他答案所示。
答案 1 :(得分:3)
你答案的一个变体,如果有更好的话就值得商榷:
case TypeRef(_, sym, _) if sum == typeOf[Unit].typeSymbol => ...
答案 2 :(得分:-1)
case TypeRef(_, sym, _) if sym.fullName == "scala.Unit" => ...