You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]]

关键调整点

  1. 重构case class定义:把原QueryResult[T: Decoder]中的上下文边界移除,避免隐式参数混入case class构造逻辑,影响Mirror生成。
  2. 补充Mirror约束:在泛型解码器的隐式方法中,新增Mirror.Of[QueryResult[T]]作为隐式参数,满足Circe在Scala 3中推导解码器的依赖要求。

如果追求更简洁的写法,也可以直接导入Circe的自动推导包import io.circe.generic.auto._,完全省去手动定义解码器的步骤,但半自动推导的写法能让你更精准控制解码逻辑。

内容的提问来源于stack exchange,提问作者pme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:09:31