scala - 在外部类构造函数中引用内部类类型

时间:2017-01-30 17:28:25

标签: scala

我想在外部构造函数中访问内部类类型,如:

// does not compile, MyInner now know from outer constructor
class MyOuter(private val mySet: Set[MyInner]) {
  class MyInner(index: Int)
}

Inner类必须是非静态的(在对象外),因为它可以访问外部类实例的某些字段。

下面的代码编译,但该字段是可变的:

class MyOuter() {
  class MyInner(index: Int)

  private var mySet: Set[MyInner] = _
  def this(_mySet: Set[MyInner]) {
    this()
    mySet = _mySet
  }

这似乎是特定于scala的,因为下面的Java代码是合法的:

import java.util.Set;

public class Outer {

    private final Set<Inner> mySet;

    public class Inner {
        private final int index;

        public Inner(int _index) {
            index = _index;
        }
    }

    public Outer(Set<Inner> _mySet) {
        this.mySet = _mySet;
    }

}

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

这句话:&#34; Inner类必须是非静态的(在对象之外),因为它可以访问外部类实例的某些字段。&#34;解释为什么你想要的是不可能的:你正在尝试创建一个类的实例,它访问另一个类的实例的字段,还不存在

不,它也不适用于java。请注意您在评论中引用的问题的答案中的static限定符。它与将内部类移动到伴随对象具有相同的效果 - java中的静态内部类只能访问外部类的静态成员。

对于你的情况,我认为这是正确的解决方案 - 制作一个伴侣对象,然后将内部类移动到那里。不,您不需要访问尚未构建的实例成员:)