我已阅读this文章,以便更好地了解Scala范围规则。
在我在GitHub上遇到一些像这样的代码之前,一切似乎都很清楚:
package x.y.z
private[z] class ExampleClass {
// class body
}
正如您所看到的,我们有一个私有顶级类,并且有一个访问限定符来修改该类的范围,但它被设置为定义类的完全相同的包。如果访问限定符被设置为封闭范围(例如包y),我会很好地得到它,但是像这样,我无法理解简单地将类声明为私有的区别:
package x.y.z
private class ExampleClass {
// class body
}
那么上面发布的两个片段有什么区别?
注意:我不知道它是否有任何相关性,但在同一个文件中,该类的伴随对象已定义并且只是声明为私有(没有访问限定符)。
答案 0 :(得分:1)
在您提供的示例中,两个修饰符具有相同的效果。如果你有一个封闭的类/对象,差异会更明显。
编译:
package x.y.z
object OuterExampleClass {
private[z] class ExampleClass()
}
object AnotherObject {
val ec = new OuterExampleClass.ExampleClass()
}
无法编译:
package x.y.z
object OuterExampleClass {
private class ExampleClass() // no [z] !!!
}
object AnotherObject {
val ec = new OuterExampleClass.ExampleClass() // error
}
带有消息:
无法访问对象OuterExampleClass中的类ExampleClass object x.y.z.OuterExampleClass