我正在try 编写我自己的LinkedHashMap子类,它在更新时执行一些额外的功能.这看起来类似于以下内容:
class MyMap(): LinkedHashMap<String, String>() {
operator fun set(key: String, value: String) {
super.put(key, value)
doSomethingWith(value)
}
}
然后,我声明一个类型为MutableMap<String, String>
的变量,并为其分配一个类型为MyMap
的对象:
val myMap: MutableMap<String, String> = MyMap()
但是,如果我现在try 使用修改后的运算符方法
myMap["key"] = "value"
我编写的方法没有被调用,但是在Kotlin(kotlin/collections/Maps.kt
)中为MuableMap定义的扩展函数被调用了.这一部分我不理解,因为我的变量的声明类型是一个接口(所以静态解析方法应该是不可能的),而动态类型是MyMap
,它定义了set
操作符,并且没有扩展函数(这两种方式都不能在类本身中隐藏实际的实现).如果我将变量的静态类型声明为MyMap
,则会像预期的那样调用我的函数.如果我的变量声明的类型不同,为什么Kotlin要通过父类来解析函数?
免责声明:我将通过覆盖put
函数来解决这个问题,所以我的问题不是关于具体的解决方案,而是更多地是关于为这个IMO奇怪的行为找到一个解释.