Могут ли типы объединения Scala 3 «исправить» проблему Map[String, Any]?
Идиоматический код Scala максимально безопасен. В результате к размышлению относятся неодобрительно, и если в итоге вы получите
Any
в ваших статических типах у вас проблема.
Например, популярная библиотека Circe может без какого-либо шаблона превратить
Map[String, String]
или
Map[String, Int]
в JSON
Map("a" -> "b").asJson
Map("one" -> 1).asJson
но если вы попытаетесь объединить два, вы получите
Map[String, Any]
и он не может с этим работать.
Map("a" -> "b", "one" -> 1).asJson // BOOM (compile-time boom, of course, we are not animals)
В Scala 3 предположительно тип будет
Map[String, String | Int]
?
Если да, то теперь возможно реализовать такие методы, как
asJson
(возможно, используя макросы, если необходимо), которые могут определить, что каждый из возможных типов в объединении является «приемлемым»?
(Пример Цирцеи был просто примером того, что в реальной жизни у вас вообще не будет этой карты, а будет правильный case-класс, для обсуждения этого аспекта см. Ветку, которая вызвала этот вопрос)