覆盖final方法

16

final方法不能在子类中被重写,但是借助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方法?是否可能或者该方法被“覆盖”了?


2
为什么 Scala 将它们视为不同的签名?是因为第一个是方法而第二个是函数吗? - SzymonPajzert
3个回答

15
你可以像这样将 TestObject 用作 Test
(TestObject: Test).doIt

+1. 使用类型注释比强制转换更好。 - Jean-Philippe Pellet

6
另一种有点“hackisch”的方法是使用命名参数调用doIt,像这样:
val x = TestObject.doIt(s = "Hello") 

1

试试这个:

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

你不觉得在这里使用 asInstanceOf 有点过度了吗? - senia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接