O compilador conhece mais informações sobre tipos do que o tempo de execução da JVM pode representar facilmente. Um manifesto é uma maneira do compilador enviar uma mensagem interdimensional para o código em tempo de execução sobre as informações de tipo que foram perdidas.
É semelhante à maneira como os Kleptonianos deixaram mensagens codificadas nos registros fósseis e no DNA "lixo" dos seres humanos. Devido às limitações dos campos de velocidade da luz e ressonância gravitacional, eles não conseguem se comunicar diretamente. Mas, se você sabe como sintonizar o sinal deles, pode se beneficiar de maneiras que não pode imaginar, ao decidir o que comer no almoço ou qual número de loteria jogar.
Não está claro se um manifesto beneficiaria os erros que você está vendo sem saber mais detalhes.
Um uso comum dos manifestos é fazer com que seu código se comporte de maneira diferente com base no tipo estático de uma coleção. Por exemplo, e se você quisesse tratar uma [String] de lista diferente de outros tipos de uma 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
Uma solução baseada em reflexão para isso provavelmente envolveria a inspeção de cada elemento da lista.
Um limite de contexto parece mais adequado ao uso de classes de tipo no scala e é bem explicado aqui por Debasish Ghosh:
http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Os limites de contexto também podem tornar as assinaturas do método mais legíveis. Por exemplo, a função acima pode ser reescrita usando limites de contexto da seguinte maneira:
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")
}