2016-01-14 84 views
0

虽然扫描通过dispatch代码的基础上,我注意到一个方法被定义如下:的方法参数等类型{DEF FOO()}

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

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

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

在此先感谢。

回答

1

这在斯卡拉世界被称为structural typing,或者更通俗地说,就是鸭打字。从链接的文章:

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

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

quacker(BigDuck) 

所以你的上述方法将接受任何对象,它定义一个abort()方法,没有实现特定接口/性状。

这是用于处理套实现没有共同接口/性状相同的方法的类特别有用的,并且可以不经改造的接口(例如,从遗留应用程序/库)

2

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

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

那么你可以把它传递给pack

pack(Bar, { ... }) 
相关问题