3

I have code that does some common operation on json objects, namely extract. So what I would like to create generic function that takes type parameter which class to expect, code looks like as follows:

def getMessageType[T](json: JValue): Either[GenericError,T] = {
  try {
    Right(json.extract[T])
  } catch {
    case e: MappingException => jsonToError(json)
  }
}

The issue is how to pass T information to that function ?

Lukasz
  • 3,135
  • 4
  • 20
  • 24

1 Answers1

7

If you look at the definition of extract: you will see that it takes a Manifest implicitly:

def extract[A](json: JValue)
    (implicit formats: Formats, mf: Manifest[A]): A

This gets around JVM type erasure by taking the "type" in as a value. For your case, I think you should do the same thing:

def getMessageType[T](json: JValue)
    (implicit f: Formats, mf: Manifest[T]): T =
{
    json.extract[T]
}

This:

  1. Gives your method implicit parameters, which must be fulfilled by the caller.

  2. Creates (those same) implicit parameters to pass them on to extract.

Owen
  • 38,836
  • 14
  • 95
  • 125