In una chiamata di prova una funzione di terze parti che restituisce un Option[Any]
. So che se questa funzione restituisce un Map
, è un Map[String, Any]
. In questo caso, voglio verificare i singoli elementi della mappa.Scala: come sopprimere gli avvertimenti non selezionati/eseguire la corrispondenza dei modelli delle mappe correttamente?
theFunction(...) match {
case Some(m: Map[String, Any]) =>
m("some key") match {
case some_condition => ... (my check)
}
case _ => fail("Invalid type")
}
Ma il compilatore avverte che case Some(m: Map[String, Any])
è deselezionato. Quando uso lo Map[_,_]
, invece, il compilatore viene richiamato nel punto in cui controllo lo m("some key")
.
Come si sopprime questo avviso, o meglio: come si esegue questo controllo correttamente? L'unico approccio mi viene in mente è qualcosa di simile
theFunction(...) match {
case Some(m: Map[_,_]) =>
val m1: Map[String, Any] = m.toSeq.map(t => t._1.asInstanceOf[String] -> t._2).toMap
m1("some key") match {
case some_condition => ... (my check)
}
}
ma ai miei occhi, questo sembra brutto e introduce inutile conversione della mappa per un Seq e viceversa.
Ho accettato la seconda risposta, e uso il mio modo complicato in quanto viene utilizzato in un test, ed è utile avere informazioni più dettagliate sull'errore se qualcosa non dovrebbe essere come previsto. – rabejens