簡體   English   中英

找不到scala.reflect.ClassManifest [T]類型的證據參數的隱式值

[英]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])

如果您沒有自己介紹ClassManifestOrdering ,那么庫的編寫者(很可能)會為您提供合理的默認值。

如果你要調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM