Scala:Can';无法从内部类引用获取外部类成员

Scala:Can';无法从内部类引用获取外部类成员,scala,inner-classes,Scala,Inner Classes,我似乎无法从内部类引用获取外部类成员: class Outer(st: Int) { val valOut = st def f = 4 class Inner { val x = 5 } } object myObj { val myOut = new Outer(8) val myIn = new myOut.Inner val myVal: Int = myIn.valOut//value f is not a member of ... myOut.Inner val x

我似乎无法从内部类引用获取外部类成员:

class Outer(st: Int)
{
  val valOut = st
  def f = 4
  class Inner { val x = 5 }
}

object myObj {
val myOut = new Outer(8)
val myIn = new myOut.Inner
val myVal: Int = myIn.valOut//value f is not a member of ... myOut.Inner
val x = myIn.f//value valOut is not a member of ... myOut.Inner
}

我在包和eclipse工作表中尝试过这一点,但都不起作用。我正在使用Eclipse3.7.2中的Scala2.10.0RC1和Scala插件2.1.0M2,我不知道您为什么希望编译它。毕竟,
internal
没有这些成员,只有它的封闭类才有这些成员。您可以通过以下方式实现您想要的:

class Outer(st: Int) {
  val valOut = st
  def f = 4
  class Inner {
    val outer = Outer.this
    val x = 5
  }
}

object myObj {
  val myOut = new Outer(8)
  val myIn = new myOut.Inner
  val myVal: Int = myIn.outer.valOut
  val x = myIn.outer.f
}

谢谢,这是一个有用的把戏,我不知道。我认为我需要在外部类中创建一个self类型,然后引用self类型来这样做。我确信Classname.this在其他地方可能很有用,不仅仅是在内部类型。我希望我的代码能够编译,因为一个内部类已经包含了对外部类的引用,在内部类中编写代码时可以自动使用外部类。因此,这看起来确实像是浪费字节,需要样板文件。这不是浪费字节,因为您可能不希望外部类的成员泄漏到内部类的API中。这仍然像是浪费字节。在我的假设下,外部固有的引用默认是公开的,而实际上它类似于受保护的(这个)。当然,合乎逻辑的解决方案是提供一种方法来更改固有外部引用的访问修饰符,如果想要更改访问,则不强制创建重复字段。如果查看
javap-v
的输出,您会注意到没有为
外部
创建第二个字段,只是一个方法,因此,每个
内部
实例都不会浪费字节。很高兴知道这一点,并且希望方法调用得到支持。