什么是避免无形的两个类型定义之间发生冲突的最佳方法

jed*_*sah 4 scala typeclass type-level-computation shapeless scala-macros

Shapeless有一个简洁的类型派生机制,允许您定义类型类并获得任何类型类的自动派生.

要将派生机制用作类型类的用户,可以使用以下语法

import MyTypeClass.auto._
Run Code Online (Sandbox Code Playgroud)

据我所知,它相当于

import MyTypeClass.auto.derive
Run Code Online (Sandbox Code Playgroud)

当您尝试在同一范围内尝试使用多个类型类时会出现问题.看起来Scala编译器只考虑了derive的最后一个定义,即使它的隐式参数有两个版本的函数"重载".

我可以通过几种方法来解决这个问题.我不会在这里列出它们,而是将它们标记为答案,您可以投票确认理智并提出任何更好的解决方案.

Tra*_*own 6

在四月提出了这个问题并提出了两个解决方案:自己定义方法(正如你的建议):

object AutoCodecJson {
  implicit def deriveEnc[T] = macro deriveProductInstance[EncodeJson, T]
  implicit def deriveDec[T] = macro deriveProductInstance[DecodeJson, T]
}
Run Code Online (Sandbox Code Playgroud)

或使用别名导入:

import AutoEncodeJson.auto.{ derive => deriveEnc }
import AutoDecodeJson.auto.{ derive => deriveDec }
Run Code Online (Sandbox Code Playgroud)

我强烈建议使用别名进口 - 迈尔斯自己说 "没想到那个宏会被重复使用:不确定我是否批准"这种deriveProductInstance方法.