在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")
答案 0 :(得分:1)
我相信(但我现在没有设置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
,这也将解析为旧版本。