Shapeless有一个整洁的类型类derivation mechanism,可让您定义类型类并为任何类型类获取自动派生。
要将派生机制用作类型类的用户,应使用以下语法
import MyTypeClass.auto._
据我了解,这相当于
import MyTypeClass.auto.derive
当您尝试在同一范围内使用多个类型类时,就会出现问题。看起来,即使在隐式参数上有两个版本的“重载”功能,Scala编译器也只考虑了derive的最后定义。
我有几种方法可以解决此问题。我不会在这里列出它们,而是将它们标记为答案,您可以对其进行投票以确认理智并提出任何更好的解决方案。
最佳答案
我raised this question back in April并提出了两种解决方案:自己定义方法(如您所建议):
object AutoCodecJson {
implicit def deriveEnc[T] = macro deriveProductInstance[EncodeJson, T]
implicit def deriveDec[T] = macro deriveProductInstance[DecodeJson, T]
}
或使用别名导入:
import AutoEncodeJson.auto.{ derive => deriveEnc }
import AutoDecodeJson.auto.{ derive => deriveDec }
我强烈建议使用别名导入-Miles himself said“没想到宏会以这种方式被重用:不确定我是否批准”关于
deriveProductInstance
方法的信息。