":" в параметре типа - PullRequest
       18

":" в параметре типа

8 голосов
/ 26 сентября 2010

В проекте scala-arm я вижу такой код:

def managed[A : Resource : Manifest](opener : => A) : ManagedResource[A] = new DefaultManagedResource(opener)

Может кто-нибудь объяснить значение [A: Resource: Manifest]?

Ответы [ 2 ]

18 голосов
/ 26 сентября 2010
def managed[A : Resource : Manifest](opener : => A) : ManagedResource[A] = new DefaultManagedResource(opener)

означает

def managed[A](opener : => A)(implicit r: Resource[A], m: Manifest[A]) : ManagedResource[A] = new DefaultManagedResource(opener)

Вы можете посмотреть текст ссылки 7.4. Контекстные границы и границы просмотра для получения дополнительной информации.

4 голосов
/ 27 сентября 2010

Используя более простой пример, чтобы проиллюстрировать:

def method[T : Manifest](param : T) : ResultType[T] = ...

Обозначение T : Manifest означает, что привязан к контексту .В другом месте вашей программы в области действия должен быть определен синглтон или значение типа Manifest[T], помеченное как неявное.

Это достигается компилятором, переписывающим сигнатуру метода для использования второго (неявного) параметраblock:

def method[T](param : T)(implicit x$1 : Manifest[T]) : ResultType[T] = ...

Как показывает ваш пример, несколько контекстных границ могут использоваться в одной и той же сигнатуре метода.Также возможно комбинировать их с границами просмотра.

...