Scala:使用抽象成员覆盖具体成员

dwi*_*ern 4 scala

我试图用一个抽象的成员覆盖一个特征成员,这似乎很简单,但实际上不会编译.

这是我正在尝试做的一个简单的例子:

// not my code:
trait Base {
  val x = new T {}
  trait T {}
}

// my code:
trait Sub extends Base {
  // compile error; see below
  override val x: T2

  // this compiles, but doesn't force `Impl` to implement `x`
//  override val x: T2 = null

  trait T2 extends T {
    val someAddition: Any
  }
}

object Impl extends Sub {
  // should be forced to implement `x` of type `T2`
}
Run Code Online (Sandbox Code Playgroud)

这是编译器错误:

Error:(7, 7) overriding value x in trait Sub of type Sub.this.T2;
 value x in trait Base of type Sub.this.T has incompatible type;
 (Note that value x in trait Sub of type Sub.this.T2 is abstract,
  and is therefore overridden by concrete value x in trait Base of type Sub.this.T)
trait Sub extends Base {
      ^
Run Code Online (Sandbox Code Playgroud)

bjf*_*her 6

我能想到的一种技术是为抽象成员使用不同的名称,并让具体成员调用这个名称.

trait Sub extends Base {
  val y: T2
  override val x = y
Run Code Online (Sandbox Code Playgroud)

在Java领域有一个有趣的讨论.