自我类型注释阻碍了内部类的实例化.为什么?

Tim*_*ske 3 scala class traits abstract self-type

鉴于Outer类及其Inner类的抽象定义,我想实例化trait中Inner1定义的具体类Outer1.

abstract class Outer {
  type Inner_Tp <: Inner;
  abstract class Inner {
    self: Inner_Tp =>
  }
}

trait Outer1 {
  self: Outer =>
  protected class Inner1 extends Inner {
    self: Inner_Tp =>
  }
  def Inner1() = new Inner1()
}
Run Code Online (Sandbox Code Playgroud)

Scala编译器过早地终止编译,给出了以下错误消息:"错误:类Inner1无法实例化,因为它不符合其自身类型Outer1.this.Inner1 with Outer1.this.Inner_Tp".为什么?

Inner1在一个抽象的上下文中定义所有类之后,它就是它的Outer1特征.我想推迟定义,type Inner_Tp直到特质混入一些具体的类.

Iul*_*gos 7

因为Inner1,自我类型表示它将始终与抽象类型一起实例化Inner_Tp.这是在实例化点没有实现的承诺:类型只是Inner1代替Inner1 with Inner_Tp.

如果需要延迟定义Inner_Tp,还需要延迟创建任何将其作为自我类型的实例.这是绝对必要的,因为您无法生成您还不知道的类型的值.所以最好把方法抽象化.您也可以优化抽象类型:

trait Outer1 extends Outer {
   type Inner_Tp <: Inner1
   protected class Inner1 extends Inner

   def Inner1(): Inner_Tp
}
Run Code Online (Sandbox Code Playgroud)

我不确定你在追求什么,但你可能根本不需要自我类型(为了简洁,我把它们留下了).