您可以在编译时调试隐式:
打开-Xlog-implicits
尝试手动解析隐式(也许也指定类型参数)并查看编译错误
implicitly[...](...manually...)
利用scala.reflect
println(reify { implicitly[...] }.tree)
使用 IDE 功能显示隐式
使用带有编译器内部的宏,您可以调试隐式解析
是否有一个类型类来检查是否存在至少一个隐式类型?
创建一个模棱两可的低优先级隐式
使用“Prolog in Scala”查找可用的类型类实例
找到第二个匹配的隐式
https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/package.scala#L119-L168
如果您正在开发类型类,请不要忘记使用注解@implicitNotFound
和@implicitAmbiguous
.
您始终可以将程序的编译推迟到运行时。所以代替程序
object App {
def main(args: Array[String]): Unit = {
println("test") // test
}
}
你可以有
import scala.reflect.runtime.currentMirror
import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox
val toolbox = currentMirror.mkToolBox()
toolbox.eval(q"""
object App {
def main(args: Array[String]): Unit = {
println("test")
}
}
App.main(Array())
""") // test
而不是
implicitly[Numeric[Int]]
你可以有
toolbox.compile(q"""
implicitly[Numeric[Int]]
""")
或者
toolbox.inferImplicitValue(
toolbox.typecheck(tq"Numeric[Int]", mode = toolbox.TYPEmode).tpe,
silent = false
)
但是,如果认为将程序编译推迟到运行时,您将能够在运行时而不是在编译时更容易地调试隐式,那就太乐观了。实际上将程序编译推迟到运行时,您会增加一层间接性,即使事情更难调试。