扩展功能问题

时间:2018-12-28 13:40:07

标签: kotlin kotlin-extension

在现有Java api中使用扩展功能时会遇到一些困难。这里有一些伪代码

public class Test {

public Test call() {
    return this;
}

public Test call(Object param) {
    return this;
}

public void configure1() {
}

public void configure2(boolean value) {
}
}

Kotlin测试

fun Test.call(toApply: Test.() -> Unit): Test {
return call()
    .apply(toApply)
}
fun Test.call(param: Any, toApply: Test.() -> Unit): Test {
return call(param)
    .apply(toApply)
}
fun main(args: Array<String>) {
val test = Test()
//refers to java method; Unresolved reference: configure1;Unresolved reference: configure2
test.call {
    configure1()
    configure2(true)
}
//refers to my extension function and works fine
test.call(test) {
    configure1()
    configure2(true)
}
}

为什么只有带有param的函数才能正常工作?有什么区别?

1 个答案:

答案 0 :(得分:3)

Kotlin将始终优先于class成员函数。由于Test:call(Object)是可能的匹配项,因此Kotlin选择该方法而不是您的扩展功能。

带有添加参数的扩展功能可以按您期望的方式解决,因为Test类没有任何先例的成员函数(没有匹配的签名),因此选择了扩展方法。

以下是有关如何解析扩展功能的Kotlin文档的链接:https://kotlinlang.org/docs/reference/extensions.html#extensions-are-resolved-statically