scala - 我可以在 Scala 中没有包私有(private)类吗?

标签 scala

对不起,吸引人的标题。 ;-)

我想在 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/

相关文章:

scala - Scala 的第一步

scala - 检查Scala/Akka Actor 是否已终止

Java ThreadPoolExecutor释放线程到线程池

javascript - Scala 和 JavaScript 的 JSON.stringify

scala - 使用 Chisel3 的两个信号 4 位之间的内积(点积。)

scala - 异常抛出的类型为 `Nothing` ?

json - 如何让 Spark 将 JSON 转义字符串字段解析为 JSON 对象以推断数据帧中的正确结构?

Scala 打字 : How to Ensure Numeric Type

scala - scala内部函数中的占位符

scala - Spark 结构化流与 Hbase 集成