Kotlin中无法向ConcurrentHashMap存入键值对,报错无数组访问set方法
问题原因及解决方案
你遇到的报错是因为变量unionMaps的类型被声明为Kotlin的只读Map接口,而只读Map没有提供下标赋值([]=)的方法——哪怕你实际赋值的是可变的ConcurrentHashMap实例,编译器也只会按照声明的类型来检查允许的操作。
ConcurrentHashMap本身是可变的,问题出在你的类型声明上,而非ConcurrentHashMap本身不可变。
解决方法
有两种修改方式:
方式一:将类型声明为MutableMap
MutableMap是Kotlin提供的可变映射接口,支持put和下标赋值操作:
class MysqlDataProviderProxy() { private val NULL: Any = Object() var unionMaps: MutableMap<Long, Any> = ConcurrentHashMap() fun init() { unionMaps[1] = NULL // 现在可以正常赋值 } }
方式二:直接声明为ConcurrentHashMap类型
如果需要直接使用ConcurrentHashMap的特有方法,也可以直接把变量类型指定为ConcurrentHashMap:
class MysqlDataProviderProxy() { private val NULL: Any = Object() var unionMaps: ConcurrentHashMap<Long, Any> = ConcurrentHashMap() fun init() { unionMaps[1] = NULL // 正常赋值 } }
简单来说,Kotlin区分只读Map和可变MutableMap,你之前用了只读的Map类型,导致无法执行修改操作,换为可变类型即可解决问题。
内容的提问来源于stack exchange,提问作者Criwran
相关产品推荐
相关产品推荐

