惯用的 Scala 代码尽可能地是类型安全的。结果,反射是不受欢迎的,如果你最终使用Any
静态类型,你就会遇到问题。
例如,流行的 Circe 库可以在没有任何样板的情况下将 aMap[String, String]
或 aMap[String, Int]
转换为 JSON
Map("a" -> "b").asJson
Map("one" -> 1).asJson
但是如果你尝试将两者结合起来,你最终会得到 aMap[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
(可能需要使用宏)之类的方法来确定联合中的每种可能类型都是“可接受的”?
(Circe 的例子只是一个例子,在现实生活中你首先没有这个 Map,而是一个适当的案例类,关于这方面的讨论,请参阅引发这个问题的线程)