Scala泛型方法 - T没有可用的ClassTag

84

我比较新于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)
                                                                        ^

非常感谢您在理解这里出了什么问题以及如何使这个人为的例子工作方面提供帮助。

1个回答

106
为了在泛型上下文中实例化数组(实例化一个类型参数为T的数组),Scala需要运行时关于T的信息,以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重新实现的版本,因此其基本原理仍然相同)


16
太有趣了。使用“import scala.reflect.ClassTag”,这很有效。谢谢。 - Chuck
4
这对人们也可能是有启发性的 - http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html - 因为ClassManifests即将被淘汰。 - Chuck
如果在函数体中对类型为T的两个值进行任何比较,除了ClassTag注释外,我们还需要一个implicit排序器参数。 - AlvaPan
我也认为这个面向Java的问题有助于理解为什么我们不需要例如Lists的ClassTags,但Martin的SIP也暗示了这一点:https://dev59.com/4nI-5IYBdhLWcg3whImk - bbarker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接