Scala通用方法 - 没有可用于T的ClassTag

时间:2013-06-04 15:00:54

标签: scala generics scala-2.10

我对Scala相对较新,我正在尝试定义一个通用的对象方法。但是,当我在方法中引用参数化类型时,我得到“没有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)
                                                                        ^

提前感谢您帮助理解这里的错误以及如何使这个人为的例子有效。

1 个答案:

答案 0 :(得分:70)

要在通用上下文中实例化数组(实例化T数组,其中T是一个类型参数),Scala需要在运行时获得有关T的信息,其形式为类型为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是ClassManifest的重新实现,因此基本原理仍然存在)