對於如下功能:關於Scala的泛型:找不到類清單的元素類型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
}
我得到:從線「的錯誤找不到類清單的元素類型T」 2.
有沒有辦法解決這個問題?
對於如下功能:關於Scala的泛型:找不到類清單的元素類型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
}
我得到:從線「的錯誤找不到類清單的元素類型T」 2.
有沒有辦法解決這個問題?
只需添加結合ClassManifest到您的方法聲明的上下文:
def reverse[T : ClassManifest](a: Array[T]): Array[T] = ...
爲了構建一個陣列,所述陣列的具體類型必須在編譯時是已知的。此類型由編譯器通過隱式ClassManifest參數提供。也就是說,數組構造方法的簽名實際上
Array[T](size: Int)(implicit m: ClassManifest[T]): Array[T]
是爲了提供此參數,必須有範圍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。
當使用[T:ClassManifest]如果它被示出爲使用棄用[T:ClassTag]
人們可以在結合的上下文中使用'Manifest'代替ClassManifest'的'。有什麼不同? – 2010-08-13 05:40:52
好問題。只是想自己弄清楚同樣的事情:-) – 2010-08-13 05:48:44
看來Manifest是scala.reflect.Manifest的一個類型別名,ScalaDoc中沒有記錄(可能是因爲它是編譯器的魔力?)。因此,爲了清晰起見,我傾向於使用ClassManifest – 2010-08-13 05:59:41