2010-12-07 46 views
3

J'ai un List[Any] de valeurs et une liste des ClassManifest[_] s correspondants, en stockant les types d'origine des valeurs. Comment puis-je convertir une valeur de la liste en son type d'origine?Valeurs de distribution à partir de Tout utilisant ClassManifest dans Scala

def cast[T](x: Any, mf: ClassManifest[T]): T = x.asInstanceOf[T] ne fonctionne pas.

Merci pour vos réponses.

+0

Votre question est assez similaire à: http://stackoverflow.com/questions/1094173/how-do-i-get-around-type-erasure-on-scala-or-why-cant-i-get- the-type-parameter – Nicolas

Répondre

3

Cela ne peut jamais fonctionner, car le type de retour de cast sera toujours considéré comme le supertype commun le plus élevé de ce que T est limité à. Il n'y a aucun moyen de le rendre plus spécifique au moment de la compilation.

Si vous essayez de construire une collection fortement typée de types disparates, alors ce que vous voulez vraiment est un HList:

http://jnordenberg.blogspot.com/2008/09/hlist-in-scala-revisited-or-scala.html

+0

Thx, ça a l'air intéressant, mais ai-je raison de dire que pour l'instant HList est limité à 10 éléments? – fehu

+0

@fehu: Pourquoi penseriez-vous cela? L'une des motivations d'un HList est qu'il peut contenir un nombre arbitraire d'éléments, dépassant la limite de 22 éléments d'un Tuple. –

0

La façon d'utiliser une instance Class en Java/Scala cast un objet est d'utiliser la méthode Class.cast. Donc, vous pouvez penser que vous pourriez faire:

mf.erasure.cast(x) //T 

Mais cela ne fonctionnera pas, car mf.erasure est un Class[_] (ou un Class<?> en Java), de sorte que le casting n'a pas de sens (à savoir offre aucune information supplémentaire). C'est (bien sûr) l'un des inconvénients de l'utilisation de génériques non réifiés.