关于Scala泛型:找不到元素类型T的类清单

时间:2010-08-13 05:12:28

标签: generics scala

对于以下功能:

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的类清单。”

有没有解决这个问题?

3 个答案:

答案 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:ClassManifest),但在scala 2.11中已弃用。
  • (T:清单)
  • (T:ClassTag),没有错误,并且看起来像是一个完美的解决方案,因为编译器给出的错误是:
      

    找不到元素类型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)
    }
  }
}