2013-12-08 39 views
16

最终方法不能在子类中重写。但是凭借Scala的魔力,这似乎是可能的。重写最终方法

考虑下面的例子:

trait Test { 
    final def doIt(s: String): String = s 
} 

object TestObject extends Test { 
    def doIt: String => String = s => s.reverse 
} 

在对象TestObject方法doIt具有不性状Test相同的签名doIt。因此doIt被重载而不是被重载。但要doIt正常通话总是调用TestObject方法:

val x = TestObject.doIt("Hello")    //> x : String = olleH 

问题: 我怎样才能呼吁TestObject原来的方法doIt。这是可能的还是这种方法“重写”?

+0

为什么斯卡拉视它为不同的签名?是因为第一是方法,第二是功能? – SzymonPajzert

回答

15

您可以使用TestObjectTest这样的:

(TestObject: Test).doIt 
+0

+1。使用类型归属确实比铸造更好。 –

1

试试这个:

TestObject.asInstanceOf[Test].doIt("Hello") 
+0

难道你不认为'asInstanceOf'在这里过度杀伤了吗? – senia

6

另一个一点点hackisch方法是调用doIt方法与命名参数是这样的:

val x = TestObject.doIt(s = "Hello")