将访问限定符设置为在Scala中定义类的相同包的私有顶级类的范围是什么?

时间:2018-03-19 14:31:26

标签: scala scope

我已阅读this文章,以便更好地了解Scala范围规则。

在我在GitHub上遇到一些像这样的代码之前,一切似乎都很清楚:

package x.y.z

private[z] class ExampleClass {
   // class body
}

正如您所看到的,我们有一个私有顶级类,并且有一个访问限定符来修改该类的范围,但它被设置为定义类的完全相同的包。如果访问限定符被设置为封闭范围(例如包y),我会很好地得到它,但是像这样,我无法理解简单地将类声明为私有的区别:

package x.y.z

private class ExampleClass {
   // class body    
}

那么上面发布的两个片段有什么区别?

注意:我不知道它是否有任何相关性,但在同一个文件中,该类的伴随对象已定义并且只是声明为私有(没有访问限定符)。

1 个答案:

答案 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