Scala.Predef.String类型的表达式不符合预期类型String

时间:2017-12-04 14:11:28

标签: string scala

我有一个函数 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字符串?

1 个答案:

答案 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] = {