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

Scala 3如何从类型召唤常量?及跨版本兼容实现

跨Scala 2.13和3的兼容方案

要同时支持两个版本,得自己封装一层统一的API,用条件编译适配不同版本的实现:

1. 定义统一的Witness类型类

先写一个通用的trait,不管哪个Scala版本都用这个来取常量:

trait Witness[T]:
  def value: T

object Witness:
  // 对外暴露的统一调用入口
  def apply[T](implicit w: Witness[T]): T = w.value

2. 分版本实现

用Scala的条件编译注释,分别对接Scala 3的标准库和Scala 2的shapeless:

object Witness:
  def apply[T](implicit w: Witness[T]): T = w.value

  // Scala 3 专属实现:对接标准库的ValueOf和constValue
  inline given [T <: Int: ValueOf]: Witness[T] with
    def value: T = constValue[T]

  // Scala 2.13 专属实现:对接shapeless的Witness
  /* if scala.util.Properties.versionNumberString.startsWith("2.") */
  implicit def fromShapeless[T](implicit w: shapeless.Witness.Aux[T]): Witness[T] =
    new Witness[T]:
      def value: T = w.value
  /* end */

3. 配置sbt依赖

确保shapeless只在Scala 2.13时引入,避免在Scala 3里报错:

libraryDependencies ++= {
  if (scalaVersion.value.startsWith("2.")) {
    Seq("com.chuusai" %% "shapeless" % "2.3.10")
  } else {
    Seq.empty
  }
}

4. 统一调用

不管哪个版本,直接用自己封装的Witness就行:

val three = Witness[3]
println(three) // 2.13和3下都输出3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:02:37