【问题标题】:Kotlin: Cannot put a key-value to ConcurrentHashMapKotlin:无法将键值放入 ConcurrentHashMap
【发布时间】:2022-11-06 00:27:49
【问题描述】:

我尝试在 Kotlin buf 中将键值对 ConcurrentHashMap 失败。编译器告诉我:No set method providing array access

class MysqlDataProviderProxy() {
    private val NULL: Any = Object()
    var unionMaps: Map<Long, Any> = ConcurrentHashMap()


    fun init() {
        unionMaps[1] = NULL // No set method providing array access
    }
}

我不知道这是什么意思。 Kotlin 中的 ConcurrentHashMap 是不可变的吗?

【问题讨论】:

  • ConcurrentHashMap 不是这里的问题。问题是unionMaps 的类型是Map,而不是MutableMap

标签: kotlin concurrenthashmap


【解决方案1】:

正如 Sweeper 所说,您在 unionMap 上的类型错误。

Kotlin 中的 ConcurrentHashMap 是不可变的吗

不,不像 Java Maps/Lists/Sets 有可变和不可变接口,接口MapListSet 是不可变的变体。

你要这个:

    class MysqlDataProviderProxy() {
        private val NULL: Any = Object()
        var unionMaps: MutableMap<Long, Any> = ConcurrentHashMap()


       init {
            unionMaps[1] = NULL
        }
    }

另一件事是您的原始函数 init() 在构造实例时没有被执行,您可能想要 init {... 如我上面所示

但这种方法的问题在于,现在您已经在代理类之外使地图可变,这可能不是您的意图,在这种情况下,您可以这样做:

    class MysqlDataProviderProxy() {
        private val NULL: Any = Object()
        var unionMaps: Map<Long, Any> = ConcurrentHashMap()

        init {
            (unionMaps as MutableMap)[1] = NULL
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多