我有一个函数 validateCell ,它将一个函数 func 作为其输入参数之一。它如下:
def validateCell[String](cellKey: String, cell: Option[String], func:(String) => Boolean): Tuple2[Boolean, String] = {
cell match {
case Some(cellContents) => (func(cellContents), s"$cellContents is not valid.")
case None => (false, s"$cellKey, not found.")
}
}
我按如下方式调用该函数:
val map = Map("Well" -> "A110")
validateCell("Well", map.get("Well"), BarcodeWell.isValidWell)
在这种情况下传递的函数如下,但我不认为它与问题有关:
def isValidWell(w: String): Boolean = {
val row: String = w.replaceAll("[^A-Za-z]", "")
val col: Int = w.replaceAll("[^0-9]+", "").toInt
isValidRow(row) && isValidColumn(col)
}
我希望validateCell返回一个Tuple(布尔值,字符串),但是我收到以下错误:
Error:(5, 55) type mismatch;
found : java.lang.String
required: String(in method validateCell)
case Some(cellContents) => (func(cellContents), s"$cellContents is not valid.")
我可以通过将case语句返回的每个元组中的java字符串转换为Scala字符串来消除此错误:
s"$cellContents is not valid.".asInstanceOf[String]
s"$cellKey, not found.".asInstanceOf[String]
这看起来真的很傻。我在这里错过了什么?这个转换不应该由Scala自动处理,为什么我的字符串首先被转换为Java字符串?
答案 0 :(得分:4)
Scala字符串和Java字符串之间没有区别。事实上,Predef.String
别名为java.lang.String
。但是,你正在处理这两件事;你正在使用一个类型参数。
def validateCell[String](cellKey: String, cell: Option[String], func:(String) => Boolean): Tuple2[Boolean, String] = {
这是一个泛型函数,它接受一个名为String
的类型参数。当你调用validateCell
时,这个类型的参数被推断并为你填写,绝对不是字符串。我的猜测是你误解了括号的意思并且你打算写
def validateCell(cellKey: String, cell: Option[String], func:(String) => Boolean): Tuple2[Boolean, String] = {