对不起,吸引人的标题。 ;-)
我想在 Scala 中使用包私有(private)方法创建一个包私有(private)类,所以我的类看起来有点像这样:
package net.java.truevfs.ext.pace
import ...
private[pace] abstract class AspectController(controller: FsController)
extends FsDecoratingController(controller) {
private[pace] def apply[V](operation: => V): V
... // lots of other stuff
}
但是,如果我使用 javap 检查 Scala 编译器有效创建的内容,我会得到如下信息:
$ javap -classpath target/classes net.java.truevfs.ext.pace.AspectController
Compiled from "AspectController.scala"
public abstract class net.java.truevfs.ext.pace.AspectController extends net.java.truevfs.kernel.spec.FsDecoratingController implements scala.ScalaObject{
public abstract java.lang.Object apply(scala.Function0);
...
}
这意味着尽管 Scala 编译器可能尊重访问限制,但我仍然可以从任何 Java 代码调用这个类,这显然违反了封装。
我错过了什么吗?
有没有办法使这项工作按预期进行?
最佳答案
除了@Régis 的回答之外,Scala 编译器不将类包私有(private)的原因是因为根据 Scala 规则,它可以从其他包访问:即 net.java.truevfs.ext.pace
的子包.例如。
package net.java.truevfs.ext.pace.subpackage
import net.java.truevfs.ext.pace.AspectController
class Subclass extends AspectController { ... }
在 Scala 中是合法的,但在来自
net.java.truevfs.ext.pace.subpackage
的 Java 类中是合法的无法从 net.java.truevfs.ext.pace
访问包私有(private)类.
关于scala - 我可以在 Scala 中没有包私有(private)类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12796902/