类型为{def foo()}的方法参数

时间:2016-01-14 17:20:00

标签: scala

在扫描dispatch代码库时,我注意到一个方法定义如下:

def pack[T](req: { def abort() }, result: => T): HttpPackage[T]

类型注释{ def abort() }对我来说很奇怪。我认为这可能是类似于鸭子打字的东西,所以我试图传递像object bar { def foo = print("Hello, world!") }这样的东西,但编译器仍然抱怨类型不匹配。我用Google搜索,但无法找到任何关于它的文章。

有没有人知道这种类型的注释及其用例?

提前致谢。

2 个答案:

答案 0 :(得分:2)

这定义了具有结构类型的参数req,即由某些成员的存在定义的类型。在这种情况下,任何类型都使用abort()方法。您无法通过bar,因为它没有这样的方法。如果您将其定义为:

object Bar {
   def abort(): Unit = print("Aborting!")
}

然后您可以将其传递给pack

pack(Bar, { ... })

答案 1 :(得分:1)

这在Scala世界中称为structural typing,或者更通俗地称为 duck typing 。来自链接的文章:

def quacker(duck: {def quack(value: String): String}) {
  println (duck.quack("Quack"))
}

object BigDuck {
  def quack(value: String) = {
    value.toUpperCase
  }
}

quacker(BigDuck)

所以上面的方法将接受定义abort()方法的任何对象,而不实现特定的接口/特征。

这对于处理在没有通用接口/特征的情况下实现相同方法的类集合特别有用,并且您无法通过改进接口(例如,从旧版应用程序/库中)