scala中顶级私有类的含义

Ima*_*gon 15 scala

比如在scala文件中我定义了一个类

private class Test{}
Run Code Online (Sandbox Code Playgroud)

这里的私人意味着什么?在java中,你不能拥有顶级私有类,这显然是有道理的.但是私有在scala中在语法上是有效的,希望有人可以对它有所了解.

sen*_*nia 16

您可以为private修饰符指定包名称,以允许仅从指定的包访问此类.默认情况下(未指定包),它仅对封闭包中的其他成员可见.

$ cat > test.scala <<EOF
package myPackage {
  private[myPackage] class Test
  private object A extends Test
}

package otherPackage {
  object B extends myPackage.Test
}
EOF

$ scalac test.scala 
test.scala:7: error: class Test in package myPackage cannot be accessed in package myPackage
  object B extends myPackage.Test
                             ^
one error found
Run Code Online (Sandbox Code Playgroud)

例如,您可以private从其伴随对象访问类,如下所示:

trait ITest
private class Test extends ITest
object Test {
  def apply(): ITest = new Test
}

Test()
// ITest = Test@59e2abc3 
Run Code Online (Sandbox Code Playgroud)

进一步澄清示例:

package myPackage {
  private class Test
  private object A extends Test
  object B extends myPackage.Test //Compile error: private class Test escapes its defining scope as part of type myPackage.Test
  private object C extends myPackage.Test // works since C is also private

  object Test {
     def apply() = new Test //error: private class Test escapes its defining scope as part of type myPackage.Test
   } 
   object Test2 {
      def apply(): ITest = new Test //works as ITest is public 
    }
}
Run Code Online (Sandbox Code Playgroud)

只要私有类的实例不转义封闭的包范围,它就可以在包层次结构中使用.访问私有类的伴随对象也必须位于相同的包层次结构中.使用private[P]- p可以是任何存在的包名称.