2010-02-12 7 views
17

Essayait de compiler du code à partir de this SO question et de lancer ce message d'erreur cannot find class manifest for element type T. Voici un autre extrait qui montre le comportement:Impossible de trouver le manifeste de classe pour le type d'élément T

scala> def f[T](a:T, b:T):Array[T] = { new Array[T](2) } 
<console>:4: error: cannot find class manifest for element type T 
     def f[T](a:T, b:T):Array[T] = { new Array[T](2) } 

je peux voir que new collection.mutable.GenericArray[T](2) résout le problème. Apparemment fournissant un manifeste est l'autre option ... Mais qu'est-ce que "fournissant un manifeste signifie"?

+1

Notez que GenericArray a été renommé en ArraySeq dans Scala 2.8 final. –

Répondre

19

Fournir des informations de type que vous pouvez utiliser un contexte lié

def f[T : Manifest](a:T, b:T):Array[T] = { new Array[T](2) } 

ou le manifeste comme argument implicite:

def f[T](a:T, b:T)(implicit manifest : Manifest[T]) : Array[T] = { new Array[T](2) } 

Le premier est le sucre syntaxique pour la suite. Le manifest est nécessaire car les informations de type sur T sont manquantes en raison du générique type errasure de la JVM.

+0

Quelques informations sont également données par Martin dans cet article http://www.scala-lang.org/sites/default/files/sids/cunei/Thu,%202009-10-01,%2013:54/arrays.pdf –

+0

Voir aussi http://stackoverflow.com/questions/3213510/what-is-manifest-in-scala-and-when-do-you-need-it pour en savoir plus sur les manifestes et l'effacement des caractères. –

+0

AFAIK ClassManifest est suffisant dans ce cas. – Landei