Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala泛型-将高阶函数作为参数传递时出现类型不匹配错误_Scala - Fatal编程技术网

Scala泛型-将高阶函数作为参数传递时出现类型不匹配错误

Scala泛型-将高阶函数作为参数传递时出现类型不匹配错误,scala,Scala,我试图将高阶泛型函数作为参数传递给另一个泛型函数。然而,我完全无法让它工作。下面是我试图实现的示例代码 def foo[T](data: Seq[T]) = { //some codes } def bar[U](id: Sring, fn: Seq[U] => Unit) = { criteria match { case x => data:Seq[String] = //some data; fn(data)

我试图将高阶泛型函数作为参数传递给另一个泛型函数。然而,我完全无法让它工作。下面是我试图实现的示例代码

def foo[T](data: Seq[T]) = {
    //some codes 
}

def bar[U](id: Sring, fn: Seq[U] => Unit) = {
    criteria match {
      case x => data:Seq[String] = //some data; 
                fn(data)
      case b => data:Seq[Int] = //some data; 
                fn(data)
      case c => data:Seq[Char] = //some data; 
                fn(data)
    }
}

bar("123", foo)
如果我运行代码,我将得到错误-类型不匹配-预期Seq[U]found-Seq[String]


如果
bar
在其中使用特定类型
String
,那么将其作为泛型是没有意义的
fn
是一个
Seq[U]=>单元
,但您传递给它的是一个非常特定的
Seq[String]
fn
仅在
U=String
时有效。如果
fn
Seq[Int]=>单元
,会发生什么情况?这些类型不能保证匹配

由于
bar
的主体期望
fn
接受
Seq[String]
,因此您唯一能做的就是要求
fn
成为
Seq[String]=>单元

def foo[T](data: Seq[T]) = data.foreach(println)

def bar(id: String, fn: Seq[String] => Unit) = {
    val data: Seq[String] = List("a", "b", "c")
    fn(data)
}

scala> bar("123", foo)
a
b
c

val数据
必须是
U
类型,因为这是
fn
的参数:

def bar[U](id: Sring, fn: Seq[U] => Unit) = {
    val data: Seq[U] = //some data.
    fn(data) //I want U to be type of data i.e. Seq[String]
}
如果希望
U
成为
字符串
,则必须在调用
bar
时指定它

bar[String]("123", foo)

这是在运行时定义的,因此您无法在
栏中决定它应该具有的类型。如果您希望它始终是一个字符串,那么只需删除
U

假设bar()调用具有多种不同数据类型的fn()。e、 正如你所说的Seq[Int]?我们可以这样做吗?因为,我在bar函数中有匹配条件,它根据条件生成不同的数据类型序列并调用fn()。如果bar()动态调用fn()呢?i、 e.可能会根据条件将不同的数据类型序列传递给foo(),如Seq[String]、Seq[Int]、Seq[Char]等,正如我在讨论中更新的那样。@RaKa这是一个完全不同的问题。你需要一个类标签:你到底想要实现什么?在我看来,没有泛型,您的代码可以大大简化