[英]About Scala generics: cannot find class manifest for element type 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
}
我從第2行得到“錯誤:無法找到元素類型T的類清單”。
反正有沒有解決這個問題?
只需在方法聲明中添加一個上下文綁定的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] = ...
后者,更簡單的表示法稱為上下文綁定 。
使用[T:ClassManifest]時如果顯示為已棄用[T:ClassTag]
在聲明Generic 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)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.