Компилятор знает больше информации о типах, чем может легко представить среда выполнения 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")
}