从构造函数中引用内部 class

Reference inner class from constructor

我有一个不可变的容器式 class。

class Foo[+T](val arg: T) {
  // ...
}

我想创建一个 Foo 的子class,它有一个内部对象作为它的参数。

class Bar extends Foo[this.Inner.type](this.Inner) {
  object Inner {
    // ...
  }
  // ...
}

我希望它是一个内部对象(而不是一个单独的对象),因为我确实需要访问 Bar 中的私有数据。然而,当我尝试编译该代码时,我得到:

Example.scala:6: error: this can be used only in a class, object, or 
class Bar extends Foo[this.Inner.type](this.Inner) {
                      ^
Example.scala:6: error: this can be used only in a class, object, or template
class Bar extends Foo[this.Inner.type](this.Inner) {template
                                       ^

是否可以使用内部对象作为参数调用 superclass 构造函数?如果是这样,我做错了什么?

已编辑

为了回应一些评论,我想我应该给出更多的细节。我的 class Foo 实际上专门化为 Foo[+T <: SomeAbstractClass] 并且它定义了几个在 SomeAbstractClass 实例上运行的操作。我想创建一个 subclass Bar,它的行为既像 Foo 又像它的底层 SomeAbstractClass。由于我不能让 Bar 从两个 class 继承,我认为内部对象是下一个最好的东西。真的,我特别想要的是 BarInner,它们分别充当 Foo 容器和 SomeAbstractClass 元素,并且可以完全访问彼此的私有变量。

由于您内在的路径依赖性 object,您尝试做的事情无法完成。也就是说,每次执行以下操作时:

val obj1 = new Bar(...){
  def lala(inner: Inner) = ...
}
val obj2 = new Bar(...)

obj1.lala(obj2.Inner) //won't compile!!

实际的 Inner 对象被重新定义。它不会编译,因为 obj1 上的 Innerobj2 上的 Inner 不同。他们不是一个类型的!

因此,您要做的是在完全确定范围和定义之前引用某物的定义。这是编译器会报错的原因之一。

解释了为什么这不能按照我想要的方式完成,但我想我会 post 对我有类似效果的解决方案。我最终写了一个包含 BarInner 的外部 class,它可以与变量上的正确访问修饰符自由交互。

class BarContainer {
  object Bar extends Foo[Inner.type](this.Inner) {
    // Any private fields should be declared private[BarContainer]
    // ...
  }
  object Inner {
    Bar.x = 3
    // ...
  }
}