对于以下功能:
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
}
我收到“错误:无法从第2行找到元素类型T的类清单。”
有没有解决这个问题?
答案 0 :(得分:10)
只需在方法声明中添加上下文绑定ClassManifest:
def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...
为了构造一个数组,必须在编译时知道数组的具体类型。此类型由编译器通过隐式ClassManifest参数提供。也就是说,Array构造函数的签名实际上是
Array[T](size: Int)(implicit m: ClassManifest[T]): Array[T]
为了提供此参数,在调用Array构造函数时,范围内必须有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。
答案 1 :(得分:2)
当使用[T:ClassManifest]时,如果显示为已弃用[T:ClassTag]
答案 2 :(得分:0)
在声明泛型类型参数时,可以通过以下方式进行操作:
找不到元素类型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)
}
}
}