gpt4 book ai didi

scala - 找不到 scala.reflect.ClassManifest[T] 类型的证据参数的隐式值

转载 作者:行者123 更新时间:2023-12-03 12:52:29 25 4
gpt4 key购买 nike

看来我不明白一些重要的事情,也许是关于删除(该死)。

我有一个方法,我想创建大小为 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)
^

请解释我做错了什么,为什么会出现这个错误,以及它使什么样的代码变得不可能?

最佳答案

Array.fill方法具有以下签名:

def fill[T](n: Int)(elem: => T)(implicit arg0: ClassManifest[T]): Array[T]

为了获得 ClassManifest[T] 的实例你需要知 Prop 体的类型。一个 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 编译器在不同的范围内寻找隐式,一个 Ordering通常不会这样指定。我建议您在互联网上查找隐式分辨率以了解更多信息。

关于scala - 找不到 scala.reflect.ClassManifest[T] 类型的证据参数的隐式值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14796390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com