컴파일러는 JVM 런타임이 쉽게 표현할 수있는 것보다 유형에 대한 자세한 정보를 알고 있습니다. 매니페스트는 컴파일러가 유실 된 유형 정보에 대해 런타임에 코드에 차원 간 메시지를 보내는 방법입니다.
이것은 Kleptonian이 어떻게 화석 기록과 인간의 "정크"DNA에 메시지를 남긴 방식과 비슷합니다. 광속 및 중력 공명 필드의 한계로 인해 직접 통신 할 수 없습니다. 그러나 신호에 맞추는 방법을 알고 있다면 점심 식사를 위해 무엇을 먹을지 또는 어떤 로또를 먹을지 결정하는 것에서 상상할 수없는 방식으로 이익을 얻을 수 있습니다.
매니페스트가 자세한 내용을 알지 못하고 현재보고있는 오류에 도움이 될지 확실하지 않습니다.
매니페스트의 일반적인 용도 중 하나는 정적 유형의 컬렉션에 따라 코드가 다르게 동작하는 것입니다. 예를 들어, 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
이것에 대한 반영 기반 솔루션에는 아마도 목록의 각 요소를 검사하는 것이 필요할 것입니다.
컨텍스트 바운드는 스칼라에서 유형 클래스를 사용하는 데 가장 적합하며 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")
}