scala - 为什么编译器不在封闭类中查找方法?

标签 scala methods compiler-errors

看看下面的 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/

相关文章:

scala - 在数字运算和繁重的字符串处理方面,Scala 是否比 Java 7 更快?

scala - flink : sortPartition(0, Order.ASCENDING ) 错误: "not found: value Order"

java - 用于静态成员初始化的静态 block 与私有(private)静态方法

javascript - Node.js - 异步方法调用问题

c - 为什么以下程序退出失败?

c++ - 找不到“iostream”文件

Jgit 的 Scala 版本

javascript - 我们如何在 lift 中使用 net.liftweb.http.js.JsCmds.Script 对象?

java - 如何限制变量的值?

c++ - 在访问说明符之前放置一个常量限定内联成员函数是错误的吗?