编译器知道的关于类型的信息比 JVM 运行时可以轻松表示的更多。 Manifest 是编译器在运行时向代码发送有关丢失的类型信息的维度间消息的一种方式。
这类似于克莱普顿人在化石记录和人类“垃圾”DNA 中留下编码信息的方式。由于光速和引力共振场的限制,它们无法直接交流。但是,如果您知道如何收听他们的信号,您就可以通过难以想象的方式受益,例如决定午餐吃什么或玩哪个乐透号码。
尚不清楚 Manifest 是否有利于您在不了解更多细节的情况下看到的错误。
清单的一个常见用途是让您的代码根据集合的静态类型表现出不同的行为。例如,如果您想将 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 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")
}