首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在Scala中没有包私有类吗?

我可以在Scala中没有包私有类吗?
EN

Stack Overflow用户
提问于 2012-10-09 17:28:48
回答 3查看 4.4K关注 0票数 18

抱歉,标题很朗朗上口。;-)

我想用Scala中的package-private方法创建一个package-private类,所以我的类看起来有点像这样:

代码语言:javascript
复制
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编译器有效地创建了什么,我会得到如下结果:

代码语言:javascript
复制
$ 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代码调用这个类,这显然违反了封装。

我是不是遗漏了什么?有没有办法让它像预期的那样工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-09 23:25:10

除了@Régis的回答之外,Scala编译器没有将类package-private设置为私有的原因是,根据Scala规则,它可以从其他包访问:即net.java.truevfs.ext.pace的子包。例如。

代码语言:javascript
复制
package net.java.truevfs.ext.pace.subpackage
import net.java.truevfs.ext.pace.AspectController

class Subclass extends AspectController { ... }

在Scala中是合法的,但是在Java中,来自net.java.truevfs.ext.pace.subpackage的类不能访问来自net.java.truevfs.ext.pace的包私有类。

票数 15
EN

Stack Overflow用户

发布于 2012-10-09 18:31:41

你不会错过任何东西。scala中的许多访问限制在java或jvm级别上都没有对应的限制。附加信息显然就在.class文件中,但作为自定义注释存在,只有scala编译器才能解释。scala对象模型只能与jvm对象模型部分匹配,java编译器只能看到这个部分模型。我想说的是,这种匹配非常接近,scala编译器在java互操作性方面做得非常好,但没有一件事是完美的。

票数 10
EN

Stack Overflow用户

发布于 2014-04-11 03:59:26

不是100%正确的答案...

如果我想用一个私有类在里面做一些花哨的事情,你可以创建一个包对象。可以像访问任何其他包一样访问package对象。类MyClass是该包对象私有的包。然而,它不是包私有的。

代码语言:javascript
复制
package object com.jasongoodwin.foo {
  private class MyClass

  class AnotherClass {
    val myClass = new MyClass
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12796902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档