2010-08-13 34 views
8

对于如下功能:关于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.

有没有办法解决这个问题?

回答

10

只需添加结合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

+0

人们可以在结合的上下文中使用'Manifest'代替ClassManifest'的'。有什么不同? – 2010-08-13 05:40:52

+0

好问题。只是想自己弄清楚同样的事情:-) – 2010-08-13 05:48:44

+0

看来Manifest是scala.reflect.Manifest的一个类型别名,ScalaDoc中没有记录(可能是因为它是编译器的魔力?)。因此,为了清晰起见,我倾向于使用ClassManifest – 2010-08-13 05:59:41

2

当使用[T:ClassManifest]如果它被示出为使用弃用[T:ClassTag]