根据您的 scalac 版本,存在合成方法导致此错误的错误。
https://issues.scala-lang.org/browse/SI-6278
说明,想象 f 是生成的:
object Test {
def main(args: Array[String]) {
class NotUsed {val x = f}
val dummy = false
def f = true
}
}
案例类、默认参数和隐式类涉及合成。
在该票证的示例代码(已修复)中,您可以通过将隐式移动到函数末尾来破坏 ok 方法:
object tiny {
def main(args: Array[String]) {
ok(); nope()
}
def ok() {
class Foo(val i: Int) {
def foo[A](body: =>A): A = body
}
implicit def toFoo(i: Int): Foo = new Foo(i)
val k = 1
k foo println("k?")
val j = 2
}
def nope() {
implicit class Foo(val i: Int) {
def foo[A](body: =>A): A = body
}
val k = 1
k foo println("k?")
//lazy
val j = 2
}
}
有什么方法可以对抗呢?
正如代码中的注释所暗示的那样,使定义变得惰性是一种解决方法。
插图2,想象一下函数太长以至于你没有注意到命名问题:
object Test {
def main(args: Array[String]) {
class NotUsed {val xs = args}
val dummy = false
// oops, shadows the parameter
def args = Seq("a","b","c")
}
}