编译器比JVM运行时更容易表示有关类型的信息。清单是编译器在运行时向代码发送关于丢失的类型信息的跨维度消息的一种方式。
这类似于克里普托人如何将编码信息留在化石记录和人类“垃圾” 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
基于反射的解决方案可能涉及检查列表中的每个元素。
上下文绑定似乎最适合在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")
}