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的重新实现,所以理由依然存在)