编译器知道关于类型的更多信息,而不是JVM运行时可以轻松表示的信息。 Manifest是编译器在运行时向代码发送间维信息的一种方式,用于说明丢失的类型信息。
这与Kleptonians如何在化石记录中留下编码信息和人类的“垃圾”DNA相似。由于光速和重力场的限制,它们无法直接通信。但是,如果你知道如何调谐他们的信号,你可以以你无法想象的方式获益,从决定午餐吃什么或吃哪个乐透号码。
如果一个清单会在不了解更多细节的情况下有利于您看到的错误,那么目前尚不清楚。
Manifests的一个常见用法是让您的代码根据集合的静态类型行为不同。例如,如果你想从其他类型的列表的区别对待列表[字符串]什么:
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戈什这里解释: 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")
}
关于Manifest/ClassManifest差异的讨论已在邮件列表中进行了讨论,请参阅http://scala-programming-language.1934581.n4.nabble.com/What-s-the-difference-between-ClassManifest-和 - Manifest-td2125122.html – 2010-07-09 23:23:57
另请参见:[Scala:什么是TypeTag,我该如何使用它?](http://stackoverflow.com/questions/12218641/scala-what-is-a-typetag-and如何使用它) – Jesper 2015-10-09 10:31:49