对于如下功能:关于Scala的泛型:找不到类清单的元素类型T
def reverse[T](a: Array[T]): Array[T] = {
val b = new Array[T](a.length)
for (i <- 0 until a.length)
b(i) = a(a.length -i - 1)
b
}
我得到:从线“的错误找不到类清单的元素类型T” 2.
有没有办法解决这个问题?
对于如下功能:关于Scala的泛型:找不到类清单的元素类型T
def reverse[T](a: Array[T]): Array[T] = {
val b = new Array[T](a.length)
for (i <- 0 until a.length)
b(i) = a(a.length -i - 1)
b
}
我得到:从线“的错误找不到类清单的元素类型T” 2.
有没有办法解决这个问题?
只需添加结合ClassManifest到您的方法声明的上下文:
def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...
为了构建一个阵列,所述阵列的具体类型必须在编译时是已知的。此类型由编译器通过隐式ClassManifest参数提供。也就是说,数组构造方法的签名实际上
Array[T](size: Int)(implicit m: ClassManifest[T]): Array[T]
是为了提供此参数,必须有范围ClassManifest调用数组构造函数时。因此,你的反向方法还必须采取隐式ClassManifest参数:
def reverse[T](a: Array[T])(implicit m: ClassManifest[T]): Array[T] = ...
// or equivalently
def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...
后者,简单的符号被称为context bound。
当使用[T:ClassManifest]如果它被示出为使用弃用[T:ClassTag]
人们可以在结合的上下文中使用'Manifest'代替ClassManifest'的'。有什么不同? – 2010-08-13 05:40:52
好问题。只是想自己弄清楚同样的事情:-) – 2010-08-13 05:48:44
看来Manifest是scala.reflect.Manifest的一个类型别名,ScalaDoc中没有记录(可能是因为它是编译器的魔力?)。因此,为了清晰起见,我倾向于使用ClassManifest – 2010-08-13 05:59:41