2010-08-13 41 views
8

對於如下功能:關於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.

有沒有辦法解決這個問題?

回答

10

只需添加結合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

+0

人們可以在結合的上下文中使用'Manifest'代替ClassManifest'的'。有什麼不同? – 2010-08-13 05:40:52

+0

好問題。只是想自己弄清楚同樣的事情:-) – 2010-08-13 05:48:44

+0

看來Manifest是scala.reflect.Manifest的一個類型別名,ScalaDoc中沒有記錄(可能是因爲它是編譯器的魔力?)。因此,爲了清晰起見,我傾向於使用ClassManifest – 2010-08-13 05:59:41

2

當使用[T:ClassManifest]如果它被示出爲使用棄用[T:ClassTag]