2012-01-04 43 views
3
scala> def a[A](b:Seq[A]) = b.toArray 
<console>:7: error: could not find implicit value 
        for evidence parameter of type ClassManifest[A] 
     def a[A](b:Seq[A]) = b.toArray 
          ^

這裏有什麼問題?我該如何解決這個問題?調用toArray時編譯器出錯

回答

6

,你所要做的就是指定可​​回收型,這將工作(斯卡拉< 2.8):

def a[A](b:Seq[A]):Array[A] = b.toArray 

由於新的集合框架,必須做特殊的轉換,以處理數組一樣集合看到Fighting bit rot頁448,我們要告訴關於高階類型,它的含義是ClassManifest,它講述了該類(有一個Manifest更寬)。

所以下面兩個例子是有效的(詳細信息,這裏Collections API Explained):

def a[A](b:Seq[A])(implicit m:ClassManifest[A]):Array[A] = b.toArray 

def a[A:ClassManifest](b:Seq[A]):Array[A] = b.toArray 
+0

沒有,至少在我的REPL。給出同樣的錯誤。 – Rogach 2012-01-04 15:09:46

+0

哎呀,你是對的......它與集合工作<2.8 – 2012-01-04 15:14:59

+0

所以我加入了> = 2.8,爲什麼它應該被賦予這樣奇怪的額外信息給編譯器 – 2012-01-04 15:27:33

4
scala> def a[A : ClassManifest](b:Seq[A]) = b.toArray 
a: [A](b: Seq[A])(implicit evidence$1: ClassManifest[A])Array[A] 

scala> 
3

您需要添加約束向它提供清單視圖:

def a[A: ClassManifest](b:Seq[A]) = b.toArray