如何在Scala中定义包private*trait*?

如何在Scala中定义包private*trait*?,scala,private,traits,Scala,Private,Traits,在Java中,可以创建包专用接口。用javap查看它们,您会发现它们缺乏“公共”可见性 在Scala中,您可以将特性声明为private[package]或protected[package],但在javap中,它仍然是公共的 那么如何在Scala中创建包私有特性呢 虽然Scala编译器尊重可见性,但我的问题是我的API可能也会从Java访问,我不想将我的内部实现公开给Java。我相信这就是你问题的答案 private在这两种语言规范中都有微妙的特殊地位 Scala和Java。查看“私人与合格

在Java中,可以创建包专用接口。用javap查看它们,您会发现它们缺乏“公共”可见性

在Scala中,您可以将特性声明为private[package]或protected[package],但在javap中,它仍然是公共的

那么如何在Scala中创建包私有特性呢


虽然Scala编译器尊重可见性,但我的问题是我的API可能也会从Java访问,我不想将我的内部实现公开给Java。

我相信这就是你问题的答案

private在这两种语言规范中都有微妙的特殊地位 Scala和Java。查看“私人与合格”的讨论 专用于SLS的“修改器”部分。简言之,私人是最重要的 与Java private相同,而private[foo]在中未标记为private 字节码,但只涉及编译时访问检查


我认为,一旦trait包被编译成字节码,就不能真正将其私有化。

使用Scala创建Java包私有修饰符是不可能的。
但是,您可以在Scala项目中自由混合使用Java和Scala文件。因此,最简单的解决方案是创建一个Java类/接口,然后在Scala中对其进行扩展。

在您的链接中,Martin Odersky自己说:“简言之,private与Java private相同,而private[foo]在字节码中没有标记为private,只是涉及编译时访问检查。”这显然与我从javap中看到的证据相矛盾,但我认为他在这里谈论的是成员、构造器,而不是类/特征。@Sebastien-很公平。我并没有注意到所有的接口都编译成了公共接口。不管怎样,我认为如果你想让你的特性可以从Java中访问,Lex的解决方案是最好的。虽然John的回答更具“教育性”,但你提供了一个解决方案,可能是唯一的一个。由于大多数Scala项目也配置为编译Java,这是合理的。