在scala文件中说我定义了一个类
private class Test{}
这里的私人意味着什么?在java中,你不能拥有顶级私有类,这显然是有道理的。但是私有在scala中在语法上是有效的,希望有人可以对它有所了解。
答案 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
可以是任何存在的包名称。