El compilador conoce más información sobre los tipos que el tiempo de ejecución de JVM puede representar fácilmente. Un manifiesto es una forma para 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 cleptonianos 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, al decidir qué comer para el almuerzo o qué número de lotería jugar.
No está claro si un Manifiesto beneficiaría los errores que está viendo sin conocer más detalles.
Un uso común de los manifiestos es hacer que su código se comporte de manera diferente según el tipo estático de una colección. Por ejemplo, ¿qué pasaría si quisiera tratar una Lista [Cadena] de manera diferente a otros tipos de 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 para esto probablemente implicaría inspeccionar cada elemento de la lista.
Un enlace de contexto parece más adecuado para usar clases de tipos en scala, y Debasish Ghosh lo explica bien aquí:
http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Los límites de contexto también pueden hacer que las firmas de métodos sean más legibles. Por ejemplo, la función anterior podría reescribirse usando límites de contexto de la siguiente 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")
}