潜在的陷阱扩展是静态解决的
要调用的扩展方法是在编译时根据被访问变量的引用类型确定的。变量的类型在运行时是什么并不重要,将始终调用相同的扩展方法。
open class Super
class Sub : Super()
fun Super.myExtension() = "Defined for Super"
fun Sub.myExtension() = "Defined for Sub"
fun callMyExtension(myVar: Super) {
println(myVar.myExtension())
}
callMyExtension(Sub())
上面的例子将打印 Defined for Super
,因为变量 myVar
的声明类型是 Super
。