`override`会覆盖任何内容,但不会给出错误

时间:2017-11-12 22:50:42

标签: scala

以下是例子:

class A {
  def postStop() {
    println("A.postStop")
  }
}

class B extends A with C {
  override def postStop() {
    println("B.postStop")
  }
}

trait C { this: B =>
  override def postStop() { // here I expected a warning
    println("C.postStop")
  }
}

object Main {
  def main(args: Array[String]) {
    new A().postStop()
  }
}

此代码打印B.postStop,并且会自动忽略C.postStop覆盖。为什么没有打印警告?这是一个错误还是一个功能?

1 个答案:

答案 0 :(得分:2)

在这种情况下,无法发出警告,因为编译器无法确定永远不会调用C.postStop()。可以在某处定义另一个类,它扩展BC并显式调用C.postStop()

class D extends B with C {
  override def postStop() {
    super[C].postStop()
  }
}

这将在您使用时调用C.postStop()

scala> D().postStop()
C.postStop