2012-01-22 6 views
3

Existe-t-il un moyen d'obtenir de manière générique un manifeste de type Scala? Par exemple, si je n'ai qu'une référence de classe avec laquelle travailler, est-il possible d'obtenir le manifeste correspondant?Généraliser un manifeste de type Scala

Répondre

7

Le implicitly[T] intégré de Scala vous obtiendra une valeur implicite de type T (s'il en existe une). Alors implicitly[Manifest[T]] retournera un Manifest pour le type T.

Si vous avez une référence de classe, vous pouvez obtenir le Manifest pour la classe comme ceci:

def manifestFor[T: Manifest](c: Class[T]) = implicitly[Manifest[T]] 

class Foo 
val x = new Foo 
manifestFor(x.getClass) 
//scala.reflect.Manifest[_ <: Foo] = _ <: Foo 

type du Manifest est _ <: Foo au lieu de simplement Foo, mais ils sont égaux.

implicitly[Manifest[Foo]] == manifestFor(x.getClass) 
//Boolean = true 
+4

Vous pouvez également utiliser 'manifest [T]', ce qui revient généralement à implicitly [Manifest [T]] '. – tenshi

+0

Bonnes choses - Merci! – Josh

0

Eh bien, j'essayais de faire quelque chose de similaire, mais de façon réfléchie. Je n'avais aucun symbole de classe au moment de la compilation disponible. J'ai dû utiliser ce code, pas si évident à partir des scaladocs, avec de multiples méthodes non évidentes et trompeuses présentes près de ce point, de sorte qu'il serait probablement utile aux autres.

Manifest.classType(Class.forName(className))