scala中顶级私有类的含义

时间:2014-01-24 17:51:16

标签: scala

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

private class Test{}

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

1 个答案:

答案 0 :(得分:15)

您可以为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

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

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

Test()
// ITest = Test@59e2abc3 

进一步澄清例子:

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 
    }
}

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