我想在外部构造函数中访问内部类类型,如:
// 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;
}
}
感谢您的帮助
答案 0 :(得分:1)
这句话:&#34; Inner类必须是非静态的(在对象之外),因为它可以访问外部类实例的某些字段。&#34;解释为什么你想要的是不可能的:你正在尝试创建一个类的实例,它访问另一个类的实例的字段,还不存在。
不,它也不适用于java。请注意您在评论中引用的问题的答案中的static
限定符。它与将内部类移动到伴随对象具有相同的效果 - java中的静态内部类只能访问外部类的静态成员。
对于你的情况,我认为这是正确的解决方案 - 制作一个伴侣对象,然后将内部类移动到那里。不,您不需要访问尚未构建的实例成员:)