潜在的陷阱扩展是静态解决的

要调用的扩展方法是在编译时根据被访问变量的引用类型确定的。变量的类型在运行时是什么并不重要,将始终调用相同的扩展方法。

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