Kotlin委托实现ConcurrentHashMap时报NoSuchElementException问题咨询
问题原因分析
- 你误用了Kotlin的Map属性委托语法规则:当使用
by 映射类实例的写法时,Kotlin会默认将该映射实例作为属性的存储容器,运行时会以属性名作为key从映射中取值返回。你的属性名为sessionMap,程序会自动调用你传入的ConcurrentHashMap的get("sessionMap")方法,该key不存在,因此直接抛出对应异常。 - 你的写法和需求不匹配:你当前的需求是将自定义的ConcurrentHashMap实例直接赋值给
sessionMap变量,不需要用到属性委托能力,直接把委托关键字by替换为赋值符号=即可解决异常。 - 额外需要注意类型对齐问题:你当前声明的变量泛型为
ConcurrentHashMap<String, Session>,但匿名类继承的父类泛型为ConcurrentHashMap<String, WebSocketSession>,如果Session不是WebSocketSession的父类,后续还会触发类型不兼容错误,需要根据实际业务对齐泛型类型。
正确示例代码
val sessionMap: ConcurrentHashMap<String, Session> = object : ConcurrentHashMap<String, Session>() { override fun put(key: String, value: Session): Session? { // 你的自定义逻辑 return super.put(key, value) } }
如果确实需要使用属性委托实现特殊逻辑,需要实现Kotlin标准库的委托接口,而不是直接传入Map实例:
import kotlin.reflect.KProperty import kotlin.properties.ReadOnlyProperty class SessionMapDelegate : ReadOnlyProperty<Any?, ConcurrentHashMap<String, Session>> { private val map = object : ConcurrentHashMap<String, Session>() { override fun put(key: String, value: Session): Session? { // 自定义逻辑 return super.put(key, value) } } override fun getValue(thisRef: Any?, property: KProperty<*>): ConcurrentHashMap<String, Session> { return map } } // 调用时使用by val sessionMap: ConcurrentHashMap<String, Session> by SessionMapDelegate()
内容的提问来源于stack exchange,提问作者user16799920
相关产品推荐
相关产品推荐

