Компілятор знає більше інформації про типи, ніж час виконання JVM може легко представити. Маніфест - це спосіб компілятора надсилати міжвимірне повідомлення до коду під час виконання інформації про інформацію про тип, яка була втрачена.
Це схоже на те, як клептоняни залишили закодовані повідомлення у копальнях викопних робіт і "мотлох" ДНК людей. Через обмеження швидкості світла та гравітаційного резонансного поля вони не можуть безпосередньо спілкуватися. Але, якщо ви знаєте, як налаштувати їх сигнал, ви можете отримати користь способами, які не уявляєте, вирішуючи, що їсти на обід або який номер лото грати.
Не ясно, чи маніфест виграє від помилок, які ви бачите, не знаючи більше деталей.
Одне поширене використання маніфестів полягає в тому, щоб ваш код поводився по-різному на основі статичного типу колекції. Наприклад, що робити, якщо ви хочете розглянути список [рядка] по-різному від інших типів списку:
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
Рішення цього на основі роздумів, ймовірно, передбачає перевірку кожного елемента списку.
Зв'язаний контекст, здається, найбільше підходить для використання типів класів у масштабі, і тут добре пояснюється Debasish Ghosh:
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")
}