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

Chu*_*uck 59 generics scala 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)
                                                                        ^
Run Code Online (Sandbox Code Playgroud)

在此先感谢帮助理解这里的错误以及如何使这个人为的例子有效.

Rég*_*les 75

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

def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
Run Code Online (Sandbox Code Playgroud)

有关此情况的(全面)描述,请参阅此文档:

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

(简而言之,ClassTags是ClassManifest的重新实现,因此基本原理仍然存在)

  • 迷人.使用'import scala.reflect.ClassTag'就行了.谢谢. (11认同)
  • 人们可能也会发现这一点很有启发性 - http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html - 因为ClassManifest正在消失. (3认同)