【问题标题】:Scala: Can't get outer class members from inner class referenceScala:无法从内部类引用中获取外部类成员
【发布时间】:2012-10-24 10:10:31
【问题描述】:

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

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 工作表中也没有工作。我在 Eclipse 3.7.2 中使用 Scala 2.10.0RC1 和 Scala 插件 2.1.0M2

【问题讨论】:

    标签: scala inner-classes


    【解决方案1】:

    我不知道你为什么希望它编译。毕竟,Inner 没有这些成员,只有它的封闭类有它们。你可以通过这种方式实现你想要的:

    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
    }
    

    【讨论】:

    • 谢谢,Outer.this 是一个我不知道的有用技巧。我想我需要在外部类中创建一个 self 类型,然后引用 self 类型来做到这一点。我确信 Classname.this 可能在其他地方有用,而不仅仅是内部类型。我希望我的代码能够编译,因为内部类已经包含对外部类的引用,您可以在内部类中编写代码时自动使用它。所以这看起来确实是浪费字节并且需要样板文件。
    • 这不是浪费字节,因为您可能不希望外部类的成员泄漏到内部类的 API 中。
    • 这似乎仍然是对字节的浪费。在我的假设下,外部固有引用默认是公开的,而实际上它类似于 protected[this]。当然,合乎逻辑的解决方案是提供一种方法来更改固有外部引用的访问修饰符,而不是在想要更改访问权限时强制创建重复字段。
    • 如果您查看javap -v 的输出,您会注意到没有为outer 创建第二个字段,只是一个方法,因此每个Inner 实例不会浪费任何字节。
    • 很高兴知道,希望方法调用能够内联。
    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多