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

scala-在外部类构造函数中引用内部类类型,scala,Scala,我想访问外部构造函数中的内部类类型,如: // does not compile, MyInner now know from outer constructor class MyOuter(private val mySet: Set[MyInner]) { class MyInner(index: Int) } 内部类必须是非静态的(对象外部),因为它可以访问外部类实例的某些字段 下面的代码可以编译,但字段是可变的: class MyOuter() { class MyInner(

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

// does not compile, MyInner now know from outer constructor
class MyOuter(private val mySet: Set[MyInner]) {
  class MyInner(index: Int)
}
内部类必须是非静态的(对象外部),因为它可以访问外部类实例的某些字段

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

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;
    }

}
import java.util.Set;
公共舱外{
私人最终集mySet;
公共阶级内部{
私有最终整数指数;
公共内部(内部索引){
指数=_指数;
}
}
公共外部(集合_mySet){
this.mySet=\u mySet;
}
}
感谢您的帮助

这句话:“内部类必须是非静态的(在对象外部),因为它可能访问外部类实例的某些字段。”解释了为什么您不可能做到这一点:您正在尝试创建一个类的实例,该实例访问另一个类的实例的字段,而这个类还不存在

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


我认为,对于您的情况,这将是正确的解决方案——创建一个伴生对象,并将内部类移动到那里。不,您不需要访问尚未构造的实例的成员:)

构造函数接受根据您试图构造的对象定义的类型的参数是没有意义的。@emilianogc您建议使用哪种模式?不确定您试图实现什么。您不能从外部实例化新的MyInner以传递给MyOuter的CTOR。在Java中,内部类意味着其他东西。@Maxim我想创建一个映射和数组数组之间的映射。内部类包含两个索引。为了这篇文章的目的,我将问题简化为一组和一组array@Maxim它不是一个简单的生成器,我已经创建了一个单独的类来处理这个包私有修饰符