コンパイラーは、JVMランタイムが簡単に表現できるよりも多くのタイプに関する情報を知っています。マニフェストは、コンパイラが実行時に、失われた型情報に関する次元間メッセージをコードに送信する方法です。
これは、クレプトン人が暗号化されたメッセージを化石記録や人間の「ジャンク」DNAに残した方法に似ています。光速と重力共鳴場の制限により、直接通信することはできません。しかし、彼らの信号に合わせる方法を知っている場合は、ランチに何を食べるか、どのロト番号をプレイするかを決めることから、想像もできない方法で利益を得ることができます。
マニフェストが、詳細を知らなくても、表示されているエラーに役立つかどうかは明確ではありません。
マニフェストの一般的な用途の1つは、コレクションの静的な型に基づいてコードの動作を変えることです。たとえば、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
これに対するリフレクションベースのソリューションは、おそらくリストの各要素を検査することを含みます。
バインドコンテキストは、ほとんどのScalaでは型クラスを使用するのに適し、よくDebasishゴーシュで、ここで説明されているようだ。
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")
}