在扫描dispatch
代码库时,我注意到一个方法定义如下:
def pack[T](req: { def abort() }, result: => T): HttpPackage[T]
类型注释{ def abort() }
对我来说很奇怪。我认为这可能是类似于鸭子打字的东西,所以我试图传递像object bar { def foo = print("Hello, world!") }
这样的东西,但编译器仍然抱怨类型不匹配。我用Google搜索,但无法找到任何关于它的文章。
有没有人知道这种类型的注释及其用例?
提前致谢。
答案 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()
方法的任何对象,而不实现特定的接口/特征。
这对于处理在没有通用接口/特征的情况下实现相同方法的类集合特别有用,并且您无法通过改进接口(例如,从旧版应用程序/库中)