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方法的信息。

09-26 18:21