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根本不想吞下它......
好,
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)
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |