значение высшего класса высшего класса в scala

Скажем в файле scala, я определяю класс как

private class Test{}

что здесь означает частный? В java вы не можете иметь личный класс верхнего уровня, что, очевидно, имеет смысл. Но частный синтаксически действителен в scala, надеюсь, что кто-то может пролить свет на него.

Ответ 1

Вы можете указать имя пакета для 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 = [email protected] 

Дальнейшие разъяснения по примерам:

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

Пока экземпляры частного класса не выходят из области охватываемого пакета, его можно использовать в иерархии пакетов. Объекты Companion, получающие доступ к частным классам, должны быть в одной иерархии пакетов. С private[P] - p может быть любое имя пакета, которое существует.