Scala通用方法 – 没有ClassTag可用于T
我相对较新的斯卡拉,并试图定义一个通用的对象方法。 但是,当我引用方法中的参数化types时,我得到“没有ClassTag可用于T”。 这是一个可以说明问题的人为的例子。
scala> def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value) <console>:7: error: No ClassTag available for T def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value) ^
在此先感谢您帮助理解这里出了什么问题,以及如何使这个人为的例子工作。
要在通用上下文中实例化一个数组(实例化一个T
的数组,其中T
是一个types参数),Scala需要在运行时拥有关于T
信息,types为ClassTag[T]
的隐式值。 具体而言,您需要方法的调用者(隐式地)传递此ClassTag
值,可以方便地使用上下文绑定来完成:
def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
有关这种情况的(彻底)描述,请参阅此文档:
http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html
(简而言之,ClassTags是ClassManifests的重新实现,所以理由依然存在)