Компилятор знает больше информации о типах, чем может легко представить среда выполнения JVM. Манифест - это способ компилятора отправить межпространственное сообщение коду во время выполнения о потерянной информации о типе.
Это похоже на то, как клептонианцы оставили закодированные сообщения в окаменелостях и «мусорной» ДНК людей. Из-за ограничений скорости света и полей гравитационного резонанса они не могут общаться напрямую. Но, если вы знаете, как настроиться на их сигнал, вы можете получить выгоду невообразимыми способами, решив, что поесть на обед или какое число в лотерею сыграть.
Неясно, принесет ли Манифест пользу ошибкам, которые вы видите, не зная более подробностей.
Одним из распространенных способов использования манифестов является изменение поведения вашего кода в зависимости от статического типа коллекции. Например, что, если вы хотите обрабатывать List [String] иначе, чем другие типы List:
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
Решение на основе отражения, вероятно, будет включать проверку каждого элемента списка.
Ограничение контекста кажется наиболее подходящим для использования классов типов в scala, и здесь это хорошо объясняет Дебасиш Гош:
http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Границы контекста также могут просто сделать сигнатуры методов более читабельными. Например, указанная выше функция может быть переписана с использованием таких контекстных границ:
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")
}