簡體   English   中英

Scala泛型 - 將高階函數作為參數傳遞時類型不匹配錯誤

[英]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]
}

如果希望UString ,則必須在調用bar時指定它。

bar[String]("123", foo)

這是在運行時定義的,因此您無法在bar內部決定它應具有的類型。 如果您希望它始終是String,那么只需刪除U

bar在其中使用特定類型的String ,它是通用的沒有意義。 fnSeq[U] => Unit ,但是你傳遞了一個非常具體的Seq[String] fn只有在U = String時才有效。 如果fnSeq[Int] => Unit什么? 這些類型不保證匹配。

由於bar的主體要求fn接受Seq[String] ,所以你唯一能做的就是要求fnSeq[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM