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章) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |