看看下面的 Scala 示例:
class A {
def foo(x: Int): Int = x
private class B {
def foo(): Int = foo(3)
}
}
编译器在尝试编译时产生错误消息:
A.scala:5: error: too many arguments for method foo: ()Int
def foo(): Int = foo(3)
^
出于某种原因,编译器没有查看封闭类
A
找到要调用的方法。它只在类里面看起来B
, 找到 foo
那里的方法不接受不适合的参数然后放弃。如果我重命名这些方法,则它可以正常工作:class A {
def bar(x: Int): Int = x
private class B {
def foo(): Int = bar(3)
}
}
在这种情况下,编译器确实在类
A
中查找并找到 bar
方法在那里。为什么第一个例子不起作用;这是根据 Scala 的规范,还是编译器错误?如果这是按照规则,那为什么规则是这样的?
顺便说一下,另一种解决问题的方法是使用 self 类型注释:
class A {
self =>
def foo(x: Int): Int = x
private class B {
def foo(): Int = self.foo(3)
}
}
最佳答案
从技术上讲,B 类是一个块。您可以将问题简化为以下几点:
def foo(x: Int): Int = x;
{
def foo(): Int = foo(3)
}
那会导致完全相同的问题。它符合规范,因为块中引入的所有名称都会隐藏任何具有相同名称的内容(忽略签名,请参阅 spec 的第 2 章)。重载只能在类级别上进行。 (spec中的第6.26.3章)
关于scala - 为什么编译器不在封闭类中查找方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248203/