潛在的陷阱擴充套件是靜態解決的

要呼叫的擴充套件方法是在編譯時根據被訪問變數的引用型別確定的。變數的型別在執行時是什麼並不重要,將始終呼叫相同的擴充套件方法。

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