使用 subvec 从 PersistentVector 创建的子向量不能成为 transient
user=> (transient (subvec [1 2 3 4] 2)) ClassCastException clojure.lang.APersistentVector$SubVector cannot be cast to clojure.lang.IEditableCollection clojure.core/transient (core.clj:2864)
原因: {{APersistentVector$SubVector}} 没有实现 {{IEditableCollection}}
补丁: CLJ-787-p1.patch
方法: 根据 {{TransientVector}} 创建一个 {{TransientSubVector}}。
两个假设
对于 {{TransientSubVector}} 将 {{ensureEditable}} 功能委派给底层 {{TransientVector}} 是可以的(有时显式,有时隐式)——显式调用 {{ensureEditable}} 还需要底层数组的字段是具体的 {{TransientVector}} 类型,而不是 {{ITransientVector}} 接口。 当在一个持久向量上抛出异常的操作从错误的线程发生(或持久化后)时,我们抛出这个异常,而不是 transient 在不适当访问时抛出的 {{IllegalAccessError}}。