2010-02-12 14 views
17

Estaba tratando de compilar algún código desde this SO question y se ejecuta en este mensaje de error cannot find class manifest for element type T. He aquí otro fragmento que muestra el comportamiento:no se puede encontrar el manifiesto de clase para el tipo de elemento 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) } 

puedo ver que new collection.mutable.GenericArray[T](2) corrige el problema. Aparentemente proporcionando un manifiesto es la otra opción ... Pero ¿qué significa "proporcionar un manifiesto"?

+1

Tenga en cuenta que GenericArray se renombró a ArraySeq en Scala 2.8 final. –

Respuesta

19

Proporcionar información de tipo se puede utilizar un contexto ligado

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

o el manifiesto como un argumento implícito:

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

El primero es el azúcar sintáctica para la tarde. El manifest es necesario porque falta la información de tipo sobre T debido al type errasure genérico de la JVM.

+0

Martin también proporciona información en este documento http://www.scala-lang.org/sites/default/files/sids/cunei/Thu,%202009-10-01,%2013:54/arrays.pdf –

+0

Vea también http://stackoverflow.com/questions/3213510/what-is-a-manifest-in-scala-and-when-do-you-need-it para obtener más información sobre manifiestos y borrado de tipos. –

+0

AFAIK ClassManifest es suficiente en este caso. – Landei

Cuestiones relacionadas