gpt4 book ai didi

scala - 如何在 Scala 中弃用具有默认值的参数?

转载 作者:行者123 更新时间:2023-12-04 15:39:02 24 4
gpt4 key购买 nike

在 metrics-scala 库中,我们有以下方法:

def timer(name: String, scope: String = null): Timer

我想弃用 scope参数并将其从下一个主要版本中删除。

我试过这个:
def timer(name: String): Timer
@deprecated(...)
def timer(name: String, scope: String): Timer

但这会导致当前主要版本中已经存在的二进制向后兼容性问题(见下文 *)。

我也试过这个:
def timer(name: String, @deprecated(...) scope: String = null): Timer

但这会在 timer 内部发出警告, 而不是给 timer 的来电者.

我是否遗漏了什么,或者真的不可能弃用具有默认值的参数?

(*) 选项 1 的 Mima 报告:
sbt:metrics4-scala-root> mimaReportBinaryIssues
[error] * synthetic method timer$default$2()java.lang.String in class nl.grons.metrics4.scala.MetricBuilder does not have a correspondent in current version
[error] filter with: ProblemFilters.exclude[DirectMissingMethodProblem]("nl.grons.metrics4.scala.MetricBuilder.timer$default$2")

最佳答案

我相信(但我现在没有 MiMa 设置来检查)您可以使用特征:

object Foo extends DeprecatedFoo {
def timer(name: String): Unit = { println("called new shiny version") }
}

trait DeprecatedFoo {
@deprecated("", "")
def timer(name: String, scope: String = null) = { println("called bad old version")}
}

Foo.timer("xx") // calls new version
Foo.timer("xx", null) // calls old version and issues a warning:

为旧版本编译的代码会做 invokevirtual Foo/timer(Ljava/lang/String;Ljava/lang/String;)Z ,这也将解析为旧版本。

关于scala - 如何在 Scala 中弃用具有默认值的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53466334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com