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

如何为Scala 3枚举值实现无原型参数的通用Circe Decoder

为枚举单例类型实现无参数Circe Decoder推导

你可以借助Scala 3的内联特性和编译期类型推导,自动获取枚举单例实例,实现无参数的Decoder推导,无需手动传入prototype参数。

改进后的代码实现

import io.circe.*

inline def deriveEnumValueDecoder[A]: Decoder[A] =
  // 编译期自动获取枚举单例实例
  val enumInstance = summonInline[A]
  Decoder.decodeString.emap: str =>
    if str == enumInstance.toString
    then Right(enumInstance)
    else Left(s"Invalid value: $str")

val json = Json.obj("processStatus" -> Json.fromString("OK"))
val jsonEnum = Json.fromString("OK")

println("MyClass: " + json.as[MyClass])
println("MyEnum: " + jsonEnum.as[MyEnum.OK.type])

case class MyClass(processStatus: MyEnum.OK.type) 

enum MyEnum:
  case OK, NOK

given Decoder[MyClass] = Decoder.derived
given Decoder[MyEnum.OK.type] = deriveEnumValueDecoder // 无参调用达成

核心原理

  • 编译期实例获取:对于枚举单例类型(如MyEnum.OK.type),Scala编译器会自动将枚举case的单例实例与该类型绑定,summonInline[A]能在编译阶段直接提取这个实例,无需手动传入。
  • 类型安全保障:整个推导逻辑在编译期完成,enumInstance的类型必然与目标类型A完全匹配,不会出现运行期类型转换错误。

这种实现既简化了调用代码,又完整保留了你原有的解码校验逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:57:17