【问题标题】:In Scala, what's the difference between declaring a top-level trait to be private or package private?在 Scala 中,将顶级 trait 声明为私有或包私有有什么区别?
【发布时间】:2015-08-04 16:54:27
【问题描述】:

在 Scala 中,将非嵌套 trait 声明为私有或包私有有什么区别。即,有什么区别

private MyTrait { ... }

private[enclosingpackage] MyTrait { ... }

我知道有不同,因为如果我添加包限定符,我可以消除某些编译错误。例如,如果我将包限定符添加到 Service 特征的定义中,这两个编译错误就会消失:

[error] /Users/dalan/s/local/eclipse/jeep/runcible/src/main/scala/
org/gaffa/gpp/runcible/httpserver/HttpServer.scala:146:
private trait Service escapes its defining scope as part of type
org.gaffa.gpp.runcible.httpserver.Service
[error] object HttpServer extends App with Service {
[error]                                    ^
[error] /Users/dalan/s/local/eclipse/jeep/runcible/src/main/scala/org/
gaffa/gpp/runcible/httpserver/HttpServer.scala:156: not found: value routes
[error] Http().bindAndHandle(routes, config.getString("http.interface"),   
config.getInt("http.port"))
[error]                      ^
[error] two errors found

在其中一条错误消息中抱怨的 routes val 位于 Service 特征中,该特征正在被 HttpServer 单例 object“扩展”。

感谢您的帮助!

附:所有有问题的代码都在同一个文件中,以防万一。

【问题讨论】:

标签: scala


【解决方案1】:

正如 Chris 引用的旧讨论文章中所述:合格的 private[foo] 和正常的 private 作用于不同的级别。

Scala 编译器会检查合格的 private[foo],只要你属于同一个包,它就可以让你访问资源。这就是为什么它在您在这里询问的情况下编译的原因。

因此,普通私有指令是 Java 常规私有指令,它将资源密封为仅供资源本身使用。

没有一个比另一个更好,当然,这取决于您要执行的保护范围。

【讨论】:

    【解决方案2】:

    没有区别。在这两种情况下都会导致编译错误,因为在这两种情况下都是“trait Service escapes its defining scope”,但是使用 qualified private 编译器会忘记做这个检查。

    好像遇到过这个bug:SI-4323

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 2021-05-11
      • 2018-03-17
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多