คอมไพลเลอร์รู้ข้อมูลเกี่ยวกับชนิดมากกว่าที่รันไทม์ JVM สามารถแสดงได้อย่างง่ายดาย Manifest เป็นวิธีที่คอมไพลเลอร์ส่งข้อความระหว่างมิติไปยังโค้ดที่รันไทม์เกี่ยวกับข้อมูลชนิดที่สูญหาย
สิ่งนี้คล้ายกับวิธีที่ชาวคลีปตันทิ้งข้อความที่เข้ารหัสไว้ในบันทึกฟอสซิลและดีเอ็นเอของมนุษย์ "ขยะ" เนื่องจากข้อ จำกัด ของสนามเรโซแนนซ์ความเร็วแสงและความโน้มถ่วงจึงไม่สามารถสื่อสารโดยตรงได้ แต่ถ้าคุณรู้วิธีปรับแต่งสัญญาณของพวกเขาคุณจะได้รับประโยชน์ในรูปแบบที่คุณคาดไม่ถึงตั้งแต่การตัดสินใจว่าจะกินอะไรเป็นอาหารกลางวันหรือจะเล่นล็อตโต้หมายเลขใด
ไม่ชัดเจนว่าไฟล์ Manifest จะเป็นประโยชน์ต่อข้อผิดพลาดที่คุณเห็นโดยไม่ทราบรายละเอียดเพิ่มเติมหรือไม่
การใช้ Manifests ทั่วไปอย่างหนึ่งคือการทำให้โค้ดของคุณทำงานแตกต่างกันไปตามประเภทคงที่ของคอลเล็กชัน ตัวอย่างเช่นถ้าคุณต้องการให้ 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
วิธีการแก้ปัญหาที่อิงตามการสะท้อนนี้อาจเกี่ยวข้องกับการตรวจสอบแต่ละองค์ประกอบของรายการ
บริบทที่ถูกผูกไว้นั้นเหมาะสมที่สุดสำหรับการใช้ type-class ใน scala และ 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")
}