看來我不明白某件重要的事情,也許關於擦除(該死的)。無法找到類型scala.reflect.ClassManifest的證據參數的隱式值[T]
我有一個方法,我想從gen
創建填入值大小n
的數組:
def testArray[T](n: Int, gen: =>T) {
val arr = Array.fill(n)(gen)
...
}
而且使用它,例如:
testArray(10, util.Random.nextInt(10))
,但我得到的錯誤:
scala: could not find implicit value for evidence parameter of type scala.reflect.ClassManifest[T]
val arr = Array.fill(n)(gen)
^
請解釋我做錯了什麼,爲什麼這個錯誤,以及它使得什麼樣的代碼變得不可能?
事實上,這有幫助。我稍微記得ClassManifest是處理類型擦除的工具嗎?可能,請你解釋一下如何構建'[T:ClassManifest]'實際上解決了這個問題?從「T」已知的地方繞過'ClassManifest [T]'的實例嗎? – dmitry 2013-02-10 10:34:47
順便說一句,我有一個更類似的問題:)在'Array.fill'之後'testArray'我嘗試實例化使用隱式Ordering的類,聲明爲MyClass [T](seq:Array [T]) (隱式ord:Ordering [T])'。因此,在'new MyClass(arr)'我看到'沒有爲T定義的隱式排序'。任何機會我可以使用清單來解決這個問題?也許使用ClassManifest實例化排序? – dmitry 2013-02-10 10:56:25
爲了得到一個'Ordering [A]'的實例,簡單的添加就像上下文綁定一樣。 'def testArray [T:ClassManifest:Ordering](n:Int,gen:=> T)'。正如我在文章中已經寫過的那樣,編譯器會在向類型參數添加上下文邊界時通過隱式實例。 – drexin 2013-02-10 11:11:25