[英]Scala compile error - could not find implicit value for evidence parameter of type
[英]Could not find implicit value for evidence parameter of type scala.reflect.ClassManifest[T]
似乎我不明白一些重要的事情,也許是關於擦除(該死的)。
我有一個方法,我想創建一個大小為n
數組,其中包含來自gen
值:
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)
^
請解釋一下我做錯了什么,為什么會出現這個錯誤,以及它使哪種代碼變得不可能?
這是因為在testArray
,在編譯時不知道具體的T
類型。 你的簽名必須看起來像def testArray[T : ClassManifest](n: Int, gen: =>T)
,這會在你的方法中添加一個類型為ClassManifest[T]
的隱式參數,它會自動傳遞給testArray
的調用然后進一步傳遞給Array.fill
調用。 這稱為context bound
。
Array.fill
方法具有以下簽名:
def fill[T](n: Int)(elem: => T)(implicit arg0: ClassManifest[T]): Array[T]
為了獲得ClassManifest[T]
的實例,您需要知道具體類型。 ClassManifest
可以像這樣獲得:
implicitly[ClassManifest[String]]
ClassManifest
隱式可用於每種具體類型。
對於任何implicit
錯誤,您可以使用type參數向方法添加所需的隱含:
def wrap[T](n:Int)(elem: => T)(implicit c:ClassManifest[T], o:Ordering[T])
如果您沒有自己介紹ClassManifest
或Ordering
,那么庫的編寫者(很可能)會為您提供合理的默認值。
如果你要調用wrap
方法:
wrap(2)(3)
它像這樣擴展:
wrap[Int](2)(3)(implicitly[ClassManifest[Int]], implicitly[Ordering[Int]])
如果您在此處引入了自定義類Person
,則會因為找不到Ordering[Person]
的隱式實例而收到錯誤。 圖書館的作者不知道如何訂購Person
。 你可以解決這個問題:
class Person
implicit val o = new Ordering[Person] { // implement required methods }
wrap(2)(new Person)
Scala編譯器在不同的范圍內查找implicits,通常不會像這樣指定Ordering
。 我建議你在互聯網上查找隱式解決方案,以了解更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.