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
相关产品推荐
相关产品推荐

