无法在子类中重写最终方法。但是,有了Scala的魔力,这似乎是可能的。
考虑以下示例:
trait Test {
final def doIt(s: String): String = s
}
object TestObject extends Test {
def doIt: String => String = s => s.reverse
}
对象doIt
中的方法TestObject
与特征doIt
中的Test
的签名不同。因此doIt
被重载而不是被覆盖。但是,doIt
的正常通话始终会调用TestObject
中的方法:
val x = TestObject.doIt("Hello") //> x : String = olleH
问题:
如何在doIt
上调用原始方法TestObject
。这是可能的还是这种方法“有点被覆盖”?
答案 0 :(得分:15)
您可以TestObject
使用Test
,如下所示:
(TestObject: Test).doIt
答案 1 :(得分:6)
另一个有点hackisch的方法是用这样的命名参数调用doIt:
val x = TestObject.doIt(s = "Hello")
答案 2 :(得分:1)
试试这个:
TestObject.asInstanceOf[Test].doIt("Hello")