我对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)
^
提前感谢您帮助理解这里的错误以及如何使这个人为的例子有效。
答案 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的重新实现,因此基本原理仍然存在)