类型定义和覆盖

时间:2016-02-01 16:58:40

标签: scala

我对Scala很陌生,我的项目的一部分最终采用了以下设计。

trait StringService {
  def length(s: String): Int
  def vowels(s: String): Int
}

这些方法用作

的参数
def processStrings(operation: String => Int) = {...}

processStrings(ss.length)之类的通话工作正常。现在我想摘要 这些方法的类型

type StringFuction = String => Int

问题在于像

这样的实现
override def length(s: String): Int = { ... }

不再有效。当然,我可以选择

override def length: StringFunction = { (s: String) => ... }

但这似乎有点偏。 什么是正确的方法?如果这不是真正的Scala方法,请随意提出不同的设计。

1 个答案:

答案 0 :(得分:0)

嗯,有不同的方法可以执行此操作,具体取决于您要使用类型别名的目的。这适用于例如:

type StringFunction = String => Int
trait Foo { def foo(s: String) = ???  }
class Bar extends Foo {
    def foo(s: String) = s.length
}

def foobar(f: StringFunction)(s) = f(s)

foobar(new Bar().foo)("bar")

这也有效:

type StringFunction = String => Int
trait Foo { def foo: StringFunction  = ???  }
class Bar extends Foo {
    override def foo = _.length
}


def foobar(f: StringFunction)(s) = f(s)
foobar(new Bar().foo)("bar")

严格来说,这些结构并不相同:在第一种情况下,Foo.foo是一个方法,它接受一个String参数并返回一个Int。 在第二种情况下,它是一个不带参数的方法,并返回一个lambda函数,它接受一个String参数,并返回一个Int。

但这种差异相当微妙。它对某些特定情况很重要,但通常可以忽略不计。