2017-12-04 2 views
0

に準拠していない、その入力パラメータの1つとして、FUNCを関数を受け取りvalidateCell、。以下のようになります:発現は、私が機能を持っている期待String型

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を期待していますが、私は次のエラーを取得:

を0
Error:(5, 55) type mismatch; 
found : java.lang.String 
required: String(in method validateCell) 
    case Some(cellContents) => (func(cellContents), s"$cellContents is not valid.") 

私はこのエラーがそうのようなScalaの文字列へのcase文によって返される各タプルにJavaの文字列を変換することにより、離れて行くことができます:

s"$cellContents is not valid.".asInstanceOf[String] 
s"$cellKey, not found.".asInstanceOf[String] 

これは本当に愚かなようです。私はここで何が欠けていますか?この変換はScalaによって自動的に処理されるべきではありません。なぜ私の文字列が最初にJava文字列としてキャストされるのですか?

答えて

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] = { 
+0

あなたは正しく推測しました。ご説明ありがとうございます。 –

関連する問題