Kompilator wie więcej informacji o typach niż można łatwo przedstawić w środowisku wykonawczym JVM. Manifest to sposób, w jaki kompilator przesyła międzywymiarowy komunikat do kodu w środowisku wykonawczym na temat utraconych informacji o typie.
Jest to podobne do tego, jak Kleptonianie pozostawili zakodowane wiadomości w zapisach kopalnych i "śmieciowe" DNA ludzi. Ze względu na ograniczenia prędkości światła i pól rezonansu grawitacyjnego nie są one w stanie komunikować się bezpośrednio. Ale jeśli wiesz, jak dostroić się do ich sygnału, możesz skorzystać w sposób, którego nie możesz sobie wyobrazić, od decydowania o tym, co zjeść na obiad lub o numerze lotto do zagrania.
Nie jest jasne, czy oczywisty skorzystają błędy widzisz, nie znając więcej szczegółów.
Jednym z typowych zastosowań Manifestów jest zachowanie kodu w różny sposób w zależności od statycznego typu kolekcji. Na przykład, co zrobić, jeśli chciał traktować listy [łańcuch] odmiennie od innych typów z listy:
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
odbicie rozwiązanie oparte A do tego najprawdopodobniej obejmować kontrolę każdego elementu listy.
Kontekst związany wydaje się najbardziej nadaje się do używania typu zajęcia w Scala, i jest dobrze wyjaśnione tutaj Debasish Ghosh: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
granice kontekstu można też po prostu zrobić podpisy metoda bardziej czytelny. Na przykład, powyższa funkcja może być ponownie napisane przy użyciu granic kontekstowych tak:
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")
}
Na liście dyskusyjnej pojawiła się dyskusja na temat różnicy Manifest/ClassManifest, patrz http://scala-programming-language.1934581.n4.nabble.com/What-s-the-difference-between-ClassManifest- and-Manifest-td2125122.html –
Zobacz też: [Scala: Co to jest TypeTag i jak tego używać?] (http://stackoverflow.com/questions/12218641/scala-what-is-a-typetag-and -how-do-i-use-it) – Jesper