Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

About Scala generics: cannot find class manifest for element type T

Tags:

generics

scala

For a function as below:

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
}

I am getting "error: cannot find class manifest for element type T" from line 2.

Is there anyway to solve this?

like image 301
ximyu Avatar asked Aug 13 '10 05:08

ximyu


2 Answers

Simply add a context bound ClassManifest to your method declaration:

def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...

In order to construct an array, the array's concrete type must be known at compile time. This type is supplied by the compiler via an implicit ClassManifest parameter. That is, the signature of the Array constructor is actually

Array[T](size: Int)(implicit m: ClassManifest[T]): Array[T]

In order to supply this parameter, there must be a ClassManifest in scope when the Array constructor is invoked. Therefore, your reverse method must also take an implicit ClassManifest parameter:

def reverse[T](a: Array[T])(implicit m: ClassManifest[T]): Array[T] = ...
// or equivalently
def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...

The latter, simpler notation is called a context bound.

like image 96
Aaron Novstrup Avatar answered Nov 20 '22 14:11

Aaron Novstrup


When using [T : ClassManifest] if it is shown as deprecated use [T : ClassTag]

like image 25
dwipan Avatar answered Nov 20 '22 14:11

dwipan