如何获取任意树的类型并检查其强弱一致性?

时间:2013-10-04 13:54:52

标签: scala macros scala-macros

例如,需要检查表达式是否为整数类型:Byte,Short,Int,Long但不是Double或Float。以下代码并不总是有效:

case Apply(Select(q, n), List(rhs)) =>
  if (q.tpe.weak_<:<(typeOf[Long])) true else false

对于某些q,即使它具有Int类型,它们的tpe也不会是弱的:

a.type weak_<:< Long == false

q.symbol.typeSignature代替q.tpe正常工作,但并非所有q都有symbol != NoSymbol

1 个答案:

答案 0 :(得分:2)

而不是q.tpe应使用q.tpe.widen

case Apply(Select(q, n), List(rhs)) =>
  if (q.tpe.widen.weak_<:<(typeOf[Long])) true else false

Int weak_<:< Long == true