2

我在使我的函数通用化时遇到了一些困难,需要一些帮助。我有一个数组,它采用 T 的选项,其中 T 是小数。在 F# 中,有一个函数“选择”,它可以从选项集合中删除无。在 scala 中,我尝试使用“flatten”,但它不适用于泛型类型。

我的代码是

var arr = Array.fill(capacity)(None :Option[T])

...后来我尝试获取 Some's 的值:

var flat = arr.flatten

错误是:

错误:找不到参数 m 的隐式值:scala.reflect.ClassManifest[U] val flat = arr.flatten

我是一个完整的 scala 菜鸟,也许不应该玩泛型 :) 我如何使这项工作?

谢谢!

4

1 回答 1

6

问题是您正在尝试创建一个新的泛型数组,而您的方法不知道如何创建,因为数组需要类型信息。然后,您应该添加一个ClassManifest上下文绑定,以便数组知道如何创建自己:

def flat[T: ClassManifest](bumpy: Array[Option[T]]): Array[T] = bumpy.flatten
val fish = Array(Some("salmon"), None, Some("haddock"))
flat(fish)  // Prints Array(salmon, haddock)

请注意,如果您尝试将数组直接传递给方法,则试图弄清楚它是什么类型会感到困惑;您需要对 val 进行赋值以使其知道数组本身包含有关其类型的所有信息,然后flat应从数组中获取其类型。

于 2012-06-09T17:35:48.593 回答