内部类的隐私和外部类型的子类型的可访问性

0__*_*0__ 1 scala private-members

我对内部类方法和构造函数的私有注释有困难.虽然这按预期工作:

trait A {
  protected def lala = ()
}

trait B extends A {
  lala
}
Run Code Online (Sandbox Code Playgroud)

以下不是:

trait A {
  class Lala protected()
}

trait B extends A {
   new Lala
}
Run Code Online (Sandbox Code Playgroud)

这也不是:

trait A {
  class Lala private[A]()
}

trait B extends A {
  new Lala
}
Run Code Online (Sandbox Code Playgroud)

唯一的方法是这样的:

object Screwed {
  trait A {
    class Lala private[Screwed]()
  }

  trait B extends A {
    new Lala
  }
}
Run Code Online (Sandbox Code Playgroud)

Scala真的在这里没有提供明确的机制,或者我错过了什么?我的猜测本来应该是,private[this.type]但是scalac根本不想吞下它......

Lui*_*hys 6

好,

trait A {
  class Lala protected()
  new Lala
}
Run Code Online (Sandbox Code Playgroud)

也不编译.错误消息似乎很合理:

 error: constructor Lala in class Lala cannot be accessed in trait A
 Access to protected constructor Lala not permitted because
 enclosing class trait A in object $iw is not a subclass of
 class Lala in trait A where target is defined
Run Code Online (Sandbox Code Playgroud)

受保护的访问意味着您只能从该类或子类访问该构造函数.你试图从封闭的特征中调用它.你可以做的一件事是:

trait B extends A {
  class Gaga extends Lala
  new Gaga
}
Run Code Online (Sandbox Code Playgroud)

出于类似的原因,我不希望你的第三个例子被编译.

还要注意受保护的构造函数和a之间的区别protected class.例如:

trait A {
  protected class P
  class U  // unprotected
}

class B extends A {
  new P  // OK
  new U  // OK
}

val b = new B
new b.P  // error
new b.U  // OK
Run Code Online (Sandbox Code Playgroud)