Вы не можете сопоставить шаблон с Map[String,Any]
из-за стирания типа. Компилятор предупредит об этом. Этот код просто совпадает с Map[_,_]
, поэтому он будет успешным с любым типом ключа, а не только с String
.
. Таким образом, метод по своей сути глючит, и кажется, что вызов из Java выявляет ошибки, которые сделали не появляется при использовании Scala.
Так как вы еще не используете это с Java, я бы переключился на безопасную реализацию кода для Java и затем быстро перенес бы устаревший код в эту версию насколько это возможно. Хотя это может быть разрушительным, это будет исправление ошибки проектирования, которая привела к ошибочному коду, поэтому это должно быть сделано раньше, а не позже. (Всякий раз, когда вы видите Any
, используемый в качестве типа значения, вполне вероятно, что дизайн в какой-то момент вышел из строя)
Типобезопасная версия не так сложна, вот примерная реализация:
class MyMap[T] {
trait MapType
case class Value(value: T) extends MapType
case class NestedMap(map: Map[String, MapType]) extends MapType
def get(map: Map[String, MapType], key: String): Option[T] = {
def loop(fields: List[String], map: Map[String, MapType]): Option[T] =
fields match {
case Nil =>
None
case field :: rest =>
map.get(field).flatMap{
case Value(res) => Some(res)
case NestedMap(m) => loop(rest, m)
}
}
loop(key.split('.').toList, map)
}
}
В действительности MyMap
должен на самом деле хранить данные Map
, а не передавать их в get
, и существуют методы для безопасного построения вложенных карт.