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?
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 .
使用[T:ClassManifest]时如果显示为已弃用[T:ClassTag]
While declaring Generic Type parameter, following ways works:
cannot find class tag for element type T
package com.github.sandip.adt
import scala.reflect.ClassTag
class QueueUsingArray[T](capacity: Int) {
var array = new Array[T](capacity)
private var front = -1
private var rare = -1
def enqueue(data: T) = {
array(rare + 1) = data
rare += 1
}
def dequeue: T = {
front += 1
array(front)
}
def isEmpty() = {
!nonEmpty
}
def nonEmpty: Boolean = {
rare > front
}
}
object Main {
def main(args: Array[String]): Unit = {
val queue = new QueueUsingArray[Int](10)
queue.enqueue(10)
queue.enqueue(20)
while (queue.nonEmpty) {
println(queue.dequeue)
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.