给定Outer类及其Inner类的抽象定义,我想实例化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()
}

Scala编译器过早地终止了编译,并显示以下错误消息:“错误:无法实例化Inner1类,因为它不符合其自身类型Outer1.this.Inner_Tp的Outer1.this.Inner1。” 为什么?

毕竟,Inner1类在抽象上下文中定义为其Outer1特性。我想将type Inner_Tp的定义推迟到该特征混入某些具体类中之前。

最佳答案

对于Inner1,自类型表示它将始终与抽象类型Inner_Tp一起实例化。这是在实例化点上无法实现的 promise :类型仅为Inner1而不是Inner1 with Inner_Tp

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

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

   def Inner1(): Inner_Tp
}

我不确定您要追求的是什么,但是您可能根本不需要自定义类型(为了简洁起见,我已经将它们省略了)。

10-07 20:29