加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么编译器不查看方法的封闭类?

发布时间:2020-12-16 18:40:17 所属栏目:安全 来源:网络整理
导读:看看下面的 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) ^ 由于某种原因,编译器不
看看下面的 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的规范,还是这是一个编译器错误?如果这是根据规则,那么为什么规则是这样的?

顺便说一下,解决问题的另一种方法是使用自我类型注释:

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章)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读