[英]Scala generics - type mismatch error when passing high order function as parameter
我正在嘗試將高階泛型函數傳遞給另一個泛型函數作為參數。 但是,我無法使其發揮作用。 以下是我想要實現的示例代碼。
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] - Seq [String]
val data
必須是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
是String
,則必須在調用bar
時指定它。
bar[String]("123", foo)
這是在運行時定義的,因此您無法在bar
內部決定它應具有的類型。 如果您希望它始終是String,那么只需刪除U
當bar
在其中使用特定類型的String
,它是通用的沒有意義。 fn
是Seq[U] => Unit
,但是你傳遞了一個非常具體的Seq[String]
。 fn
只有在U = String
時才有效。 如果fn
是Seq[Int] => Unit
什么? 這些類型不保證匹配。
由於bar
的主體要求fn
接受Seq[String]
,所以你唯一能做的就是要求fn
為Seq[String] => Unit
。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.