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这是一个完全不同的问题。你需要一个类标签:你到底想要实现什么?在我看来,没有泛型,您的代码可以大大简化