Scala 3中如何用Circe半自动方式解码泛型样例类?
Scala 3 中 Circe 泛型解码器推导的问题解决
你这段代码在 Scala 2.13 正常运行,但到 Scala 3 编译报错,本质是 Scala 3 的类型推导机制和 Circe 的适配逻辑发生了变化——Scala 3 版本的 Circe 依赖 deriving.Mirror.Of 来生成解码器,而泛型类 QueryResult[T] 的 Mirror 实例,没法仅靠 T: Decoder 的约束自动生成。
修复后的可运行代码
import io.circe.generic.semiauto._ import io.circe.Decoder import scala.deriving.Mirror case class Name(name: String) // 从case class定义中移除Decoder上下文边界,让它成为纯数据类 case class QueryResult[T](data: T) implicit val nameDecoder: Decoder[Name] = deriveDecoder[Name] // 新增Mirror.Of[QueryResult[T]]隐式参数,让编译器能为具体T生成对应Mirror implicit def queryResultDecoder[T](implicit tDecoder: Decoder[T], mirror: Mirror.Of[QueryResult[T]] ): Decoder[QueryResult[T]] = deriveDecoder[QueryResult[T]]
关键调整点
- 重构case class定义:把原
QueryResult[T: Decoder]中的上下文边界移除,避免隐式参数混入case class构造逻辑,影响Mirror生成。 - 补充Mirror约束:在泛型解码器的隐式方法中,新增
Mirror.Of[QueryResult[T]]作为隐式参数,满足Circe在Scala 3中推导解码器的依赖要求。
如果追求更简洁的写法,也可以直接导入Circe的自动推导包import io.circe.generic.auto._,完全省去手动定义解码器的步骤,但半自动推导的写法能让你更精准控制解码逻辑。
内容的提问来源于stack exchange,提问作者pme
相关产品推荐
相关产品推荐

