76

我对 Scala 比较陌生,正在尝试定义一个通用对象方法。但是,当我在方法中引用参数化类型时,我得到“没有可用于 T 的 ClassTag”。这是一个说明问题的人为示例。

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)
                                                                        ^

提前感谢您帮助理解这里出了什么问题以及如何使这个人为的示例工作。

4

1 回答 1

96

为了在泛型上下文中实例化一个数组(实例化一个类型参数T在哪里的数组T),Scala 需要在运行时T以 type 的隐式值的形式获得关于 的信息ClassTag[T]。具体来说,您需要方法的调用者(隐式)传递此ClassTag值,这可以使用上下文绑定方便地完成:

def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value)

有关这种情况的(彻底)描述,请参阅此文档:

https://docs.scala-lang.org/sips/scala-2-8-arrays.html

(简而言之,ClassTags 是 ClassManifests 的重新实现,所以基本原理仍然存在)

于 2013-06-04T15:10:44.447 回答