Kompilator zna więcej informacji o typach niż środowisko wykonawcze maszyny JVM może z łatwością przedstawić. Manifest to sposób, w jaki kompilator wysyła do kodu w czasie wykonywania komunikat międzywymiarowy dotyczący utraconych informacji o typie.
Jest to podobne do tego, jak Kleptonianie pozostawili zakodowane wiadomości w zapisach kopalnych i „śmieciowym” DNA ludzi. Ze względu na ograniczenia prędkości światła i pola rezonansu grawitacyjnego nie mogą się bezpośrednio komunikować. Ale jeśli wiesz, jak dostroić się do ich sygnału, możesz skorzystać na sposoby, których nie możesz sobie wyobrazić, decydując o tym, co zjeść na lunch lub w którą lotto zagrać.
Nie jest jasne, czy Manifest przyniósłby korzyści dla błędów, które widzisz, nie znając więcej szczegółów.
Jednym z typowych zastosowań manifestów jest to, że kod zachowuje się inaczej w zależności od statycznego typu kolekcji. Na przykład, co by było, gdybyś chciał traktować List [String] inaczej niż inne typy 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"))
foo(List(1, 2))
foo(List("one", 2))
Oparte na refleksji rozwiązanie tego problemu wymagałoby prawdopodobnie sprawdzenia każdego elementu listy.
Wiązanie kontekstu wydaje się najbardziej odpowiednie do używania klas typu w scali i jest dobrze wyjaśnione tutaj przez Debasish Ghosh:
http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Ograniczenia kontekstu mogą również sprawić, że sygnatury metod będą bardziej czytelne. Na przykład powyższa funkcja może zostać ponownie napisana przy użyciu ograniczeń kontekstu, takich jak:
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")
}