Published 2012-08-02.
Time to read: 1 minutes.
Type parameters provide types for constructing any arguments that are implicit manifests.
This helps when working with Salat.
In the following code, dbo is a com.mongodb.DBObject, perhaps retrieved as the result of a find().
Salat uses _typeHint to store the fully qualified name of the persisted class;
this property is returned as one of the properties of dbo.
The call to Salat's grater() method converts dbo into the desired type.
The type is constrained using a lower bound to be a subclass of PubSubAction.
def findWithSeqNum[T <: PubSubAction](seqNum: Long)
(implicit manifest: Manifest[T]): Option[T] = {
val klass = manifest.erasure.asInstanceOf[Class[T]]
val item = myCollection.findOne(
MongoDBObject("seqNum" -> seqNum, "_typeHint" -> klass.getName))
item match {
case Some(dbo: DBObject) =>
Some(grater(ctx, Manifest.classType(klass)).asObject(dbo))
case None =>
None
}
}
When called as follows, the type parameter need not be provided because there is an explicit manifest argument:
findWithSeqNum(11)(Manifest.classType(classOf("com.micronautics.Blah"))
When called as follows, the type parameter provides the value for constructing the implicit manifest argument:
findWithSeqNum[Blah](11)
Of course, you can also explicitly define an implicit manifest at any scope that you desire:
implicit val manifest: ClassManifest[Blah] findWithSeqNum(11)
If the type of the manifest is dynamic (only known at runtime), you can define manifest this way:
val mtype = "com.micronautics.Blah" implicit val manifest = Manifest.classType(Class.forName(mtype)) findWithSeqNum(11)