El compilador conoce más información acerca de los tipos que el tiempo de ejecución JVM puede representar fácilmente. Un Manifiesto es una forma de que el compilador envíe un mensaje interdimensional al código en tiempo de ejecución sobre la información de tipo que se perdió.
Esto es similar a cómo los Kleptonianos han dejado mensajes codificados en los registros fósiles y el ADN "basura" de los humanos. Debido a las limitaciones de la velocidad de la luz y los campos de resonancia gravitacional, no pueden comunicarse directamente. Pero, si sabe cómo sintonizar su señal, puede beneficiarse de maneras que no puede imaginar, desde decidir qué comer para el almuerzo o qué número de lotería jugar.
No está claro si un Manifest beneficiaría los errores que está viendo sin conocer más detalles.
Un uso común de Manifests es que su código se comporte de forma diferente en función del tipo estático de una colección. Por ejemplo, ¿qué pasaría si se quería tratar de una lista [String] diferente a otros tipos de una lista:
def foo[T](x: List[T])(implicit m: Manifest[T]) = {
if (m <:< manifest[String])
println("Hey, this list is full of strings")
else
println("Non-stringy list")
}
foo(List("one", "two")) // Hey, this list is full of strings
foo(List(1, 2)) // Non-stringy list
foo(List("one", 2)) // Non-stringy list
Una solución basada en la reflexión a esto probablemente implicará la inspección de cada elemento de la lista.
Un contexto con destino parece más adecuado para el uso de tipo-clases en Scala, y está bien explicado aquí por Debasish Ghosh: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
límites de contexto también pueden simplemente hacer las firmas de los métodos más legible. Por ejemplo, la función anterior podría ser re-escrito usando los límites del contexto de esta manera:
def foo[T: Manifest](x: List[T]) = {
if (manifest[T] <:< manifest[String])
println("Hey, this list is full of strings")
else
println("Non-stringy list")
}
Ha habido una discusión en la lista de correo acerca de la diferencia Manifiesto/ClaseManifiesto, vea http://scala-programming-language.1934581.n4.nabble.com/What-s-the-difference-between-ClassManifest- and-Manifest-td2125122.html –
Vea también: [Scala: ¿Qué es un TypeTag y cómo lo uso?] (http://stackoverflow.com/questions/12218641/scala-what-is-a-typetag-and -how-do-i-use-it) – Jesper