Kompiler mengetahui lebih banyak informasi tentang tipe daripada yang dapat dengan mudah direpresentasikan oleh runtime JVM. Manifest adalah cara bagi kompiler untuk mengirim pesan antar-dimensi ke kode pada saat runtime tentang jenis informasi yang hilang.
Ini mirip dengan bagaimana orang Kleptonia meninggalkan pesan yang disandikan dalam catatan fosil dan "sampah" DNA manusia. Karena keterbatasan kecepatan cahaya dan bidang resonansi gravitasi, mereka tidak dapat berkomunikasi secara langsung. Tetapi, jika Anda tahu cara menyesuaikan sinyal mereka, Anda dapat mengambil manfaat dengan cara yang tidak dapat Anda bayangkan, dari memutuskan apa yang akan dimakan untuk makan siang atau nomor lotre mana yang akan dimainkan.
Tidak jelas apakah Manifest akan menguntungkan kesalahan yang Anda lihat tanpa mengetahui lebih detail.
Salah satu penggunaan Manifest yang umum adalah membuat kode Anda berperilaku berbeda berdasarkan pada jenis statis koleksi. Misalnya, bagaimana jika Anda ingin memperlakukan Daftar [String] berbeda dari jenis Daftar lainnya:
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
Solusi berbasis refleksi untuk ini mungkin akan melibatkan memeriksa setiap elemen daftar.
Batas konteks tampaknya paling cocok untuk menggunakan tipe-kelas dalam scala, dan dijelaskan dengan baik di sini oleh Debasish Ghosh:
http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
Batas konteks juga bisa membuat metode tanda tangan lebih mudah dibaca. Misalnya, fungsi di atas dapat ditulis ulang menggunakan batas konteks seperti:
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")
}