2016-01-14 1 views
0

При сканировании через dispatch базу кода, я заметил метод определяется следующим образом:Параметры метода с типом, как {четкости Foo()}

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

Тип аннотаций { def abort() } выглядит очень странно для меня. Я подумал, что это может быть что-то похожее на утиную печать, поэтому я попытался передать что-то вроде object bar { def foo = print("Hello, world!") }, но компилятор все еще жалуется на тип несоответствия. Я googled, но не мог найти упоминания об этой статье.

Кто-нибудь знает об аннотациях этого типа и его вариантах использования?

Заранее спасибо.

ответ

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, { ... }) 
Смежные вопросы