Из следующего кода:
type Structure = Map[String, Any]
def getStructureSourceNames(structuresDesc: Structure): Iterable[String] = {
val subColsDesc: Map[String, String] =
structuresDesc.filter(_._2.isInstanceOf[String]).asInstanceOf[Map[String, String]]
val subStructuresDesc: Map[String, Structure] = structuresDesc
.filter(_._2.isInstanceOf[Map[String, Structure]])
.asInstanceOf[Map[String, Structure]]
subColsDesc.values ++ subStructuresDesc.values.flatMap(getStructureSourceNames(_))
}
Я хочу передать рекурсивную карту (String -> String), т.е. Пример структуры:
Map("test" -> Map(
"newid" -> "id",
"newstring" -> "string",
"toto" -> Map("newdouble" -> "double")
),
"otherid" -> "id")
Метод getStructureSourceNames
должен возвращать список «окончательных» значений, т.е. просмотрите все дерево и для каждого листа получите значение String.
Когда я запускаю этот код, это заставляет меня:
Warning:(78, 32) non-variable type argument String in type scala.collection.immutable.Map[String,Structure] (the underlying of Map[String,Structure]) is unchecked since it is eliminated by erasure
.filter(_._2.isInstanceOf[Map[String, Structure]])
Более того, я не люблю использовать isInstanceOf/ asInstanceOf. Погуглив, я обнаружил, что могу использовать сопоставление с образцом для проверки типа и получить карту с ожидаемой типизацией, но не могу найти, как это сделать.
Не могли бы вы привести пример такого кода?