如何检查 WeakTypeTagType 是否代表具体类型?这在宏中特别有用,当用户给出的类型不具体时,我可以使用它来引发编译错误:

def macroMethod[T]: Unit = macro macroMethod_impl[T]

def macroMethod_impl[T: c.WeakTypeTag](c: Context): c.Expr[Unit] = {
  import c.universe._

  def isConcrete(tpe: Type) = ???

  if(!isConcrete(weakTypeOf[T])) {
    c.error(c.enclosingPosition, "You must provide concrete type.")
  }

  c.literalUnit
}

最佳答案

我认为这可以解决问题:

def isConcrete(tpe: Type) = !tpe.typeSymbol.asType.isAbstractType

然后
scala> macroMethod[Int]

scala> class C[T] { macroMethod[T] }
<console>:10: error: You must provide concrete type.
       class C[T] { macroMethod[T] }

关于scala - 如何检查 WeakTypeTag 或 Type 是否代表具体类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15898037/

10-10 07:11