Scala泛型方法-没有可用于T的类标记

Scala泛型方法-没有可用于T的类标记,scala,generics,scala-2.10,Scala,Generics,Scala 2.10,我对Scala比较陌生,正在尝试定义一个通用对象方法。然而,当我在方法中引用参数化类型时,我得到的是“没有可用于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, va

我对Scala比较陌生,正在尝试定义一个通用对象方法。然而,当我在方法中引用参数化类型时,我得到的是“没有可用于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)
                                                                        ^
scala>def foo[T](计数:Int,值:T):数组[T]=Array.fill[T](计数)(值)
:7:错误:没有可用于T的类标记
def foo[T](计数:Int,值:T):数组[T]=Array.fill[T](计数)(值)
^

提前感谢您帮助我们理解这里的错误以及如何使这个精心设计的示例工作。

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

有关这种情况的(全面)描述,请参阅本文件:


(简而言之,ClassTags是类清单的重写实现,因此基本原理仍然存在)

。使用“import scala.reflect.ClassTag”可以实现这一点。谢谢。人们可能也会觉得这很有启发性——因为类清单正在消失。如果我们对函数体中T类型的两个值进行比较,除了
ClassTag
注释之外,我们还需要一个
implicit
order参数。我发现这个面向Java的问题对于理解为什么我们不需要类标签(例如列表)很有帮助,但Martin的SIP也暗示了这一点:
def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value)