在插入元素时尝试抛出异常需要在映射中扫描所有现有元素来验证它们是否可以与您要插入的元素进行比较,这将对性能和可扩展性造成巨大影响。同样,在引发比较并将异常转换为`nil`时捕获异常会添加开销,这将在映射的每项正确使用中浪费。这不是Clojure中唯一一个你必须了解所涉及数据结构的实际契约,并且必须正确使用否则会得到意外结果,以性能为代价的情况。(更不用说还需要创建所有底层Java类针对Clojure的特殊实现才能添加这些功能。)
在这个例子中,涉及到的数据结构是Java的`SortedMap`接口。以下是Java文档中的第二段内容:
所有插入到排序映射中的键都必须实现`Comparable`接口(或在特定的比较器中被接受)。此外,所有这样的键必须能够相互比较:对于映射中的任何键`k1`和`k2`,`k1.compareTo(k2)`(或`comparator.compare(k1, k2)`)不能抛出`ClassCastException`。尝试违反此限制将导致引发异常的方法或构造函数调用抛出`ClassCastException`。
随着你在JVM Clojure中深入了解,你不可避免地需要了解其构建于其上并与之交互的Java类库的细节。就此而言,归档链接以及可能将其总结/翻译成Clojure术语到Clojure文档字符串可能会有所帮助。