我正在构建一个受益于多功能收集包装的应用程序,因此我将目光投向了Hack收集界面。其中两个特别有前途:KeyedContainer<+Tk, +Tv>
和ConstIndexAccess<Tk, +Tv>
。方括号访问语法允许Tk
在前者中是协变的,这已证明非常有用 - 否则getter方法在参数(逆变)位置需要Tk
。这意味着我可以在次线性时间(参数位置Tk
)中访问元素,或者根据需要循环访问集合和访问键(返回位置Tk
)。缺点是KeyedContainer
无法有效扩展:它没有定义任何方法。
目前,我需要一个带有不可变祖先的可变键控集合类型。受KeyedContainer
的这一限制,我考虑通过放弃密钥foreach
并使用ConstIndexAccess
咬住子弹,IndexAccess
定义了一个明确的getter并且有一个可变的MutableMap
MutableVector
和Tk
继承的孩子。
ConstIndexAccess
的不变性使ConstIndexAccess
类型的功能不那么强大,但也暗示可能有某种方法可以从中读取密钥。这是Tk
在Tk
上不是逆变的原因吗?它的后代都不是foreach
的协变,并且不可能使用dataSnapshot.getKey()
进行迭代。据我所知,所有其他标准的Hack合同都有尽可能灵活的差异。