8

In scala-arm project, I see code like this:

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

Can someone explain the meaning of [A : Resource : Manifest] ?

oluies
  • 17,694
  • 14
  • 74
  • 117
xiefei
  • 6,563
  • 2
  • 26
  • 44

2 Answers2

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

means

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

You can look link text 7.4 Context Bounds and View Bounds for more information.

Guillaume Massé
  • 8,004
  • 8
  • 44
  • 57
Eastsun
  • 18,526
  • 6
  • 57
  • 81
4

Using a simpler example to illustrate:

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

The notation T : Manifest means that there is a context bound. Elsewhere in your program, in scope, must be defined a singleton or value of type Manifest[T] that's marked as an implicit.

This is achieved by the compiler rewriting the method signature to use a second (implicit) parameter block:

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

As your example illustrates, multiple context bounds can be used in the same method signature. It's also possible to combine them with view bounds.

Kevin Wright
  • 49,540
  • 9
  • 105
  • 155