Kotlin 为什么MutableMap.keys必须返回MutableSet?

Kotlin 为什么MutableMap.keys必须返回MutableSet?,kotlin,collections,Kotlin,Collections,MutableMap.keys属性定义为:abstract-val-keys:MutableSet 我知道键的内容将随着基础地图的变化而变化,但是键如何能够自我修改?IE:调用map.keys.add(xxx) Rq:我在围绕可变映射创建代理时遇到了这个问题。我必须调整条目和键内容,但不想实现删除/添加/清除方法如果尝试添加内容,则键返回的可变表集会抛出不支持操作异常。它提供了删除和过滤(保持所有< /代码>)操作,这可以简化不需要考虑值的操作,只需要键。 如果您已经在使用可变映射,那么您也应该

MutableMap.keys
属性定义为:
abstract-val-keys:MutableSet

我知道
的内容将随着基础地图的变化而变化,但是
如何能够自我修改?IE:调用
map.keys.add(xxx)


Rq:我在围绕可变映射创建代理时遇到了这个问题。我必须调整
条目
内容,但不想实现
删除/添加/清除
方法

如果尝试添加内容,则
返回的
可变表集
会抛出
不支持操作异常。它提供了删除和过滤(<代码>保持所有< /代码>)操作,这可以简化不需要考虑值的操作,只需要键。

如果您已经在使用可变映射,那么您也应该能够以可变的方式直接使用键,这是有意义的。

它对应于Java方法,该方法的文档记录如下:

返回此映射中包含的键的集合视图。集合由映射支持,因此对映射的更改将反映在集合中,反之亦然。如果在对集合进行迭代时修改映射(通过迭代器自己的移除操作除外),则迭代的结果是未定义的该集合支持元素移除,即通过迭代器.remove、set.remove、removeAll、retainal和clear操作从映射中移除相应的映射。它不支持添加或添加所有操作


粗体部分解释了为什么它在Kotlin中表示为
MutableSet
;否则,您无法使用这些功能移植Java代码。

如果在基础映射发生变化时键可能会发生变化,您认为什么是更好的选择?我认为这只是Kotlin映射平台类型的一个奇怪之处,例如在Java中,可变/不可变之间没有区别,因此它默认为可变。@Mattfanke,标准Kotlin集合接口不强制执行不变性。这只意味着调用方无法修改集合。但基础集合可以更改。在我看来,MutableMap.keys应该是一个集合而不是一个MutableSet,即使内容可以更改(如果底层的MutableMap发生了更改)@Pawel确实,它们是同一个Jvm类,但对于Kotlin编译器,它们是不同的。返回的集合是部分可修改的,因此应该是一个MutableSet,正在为非法操作引发UnsupportedOperationException。