在现有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的函数才能正常工作?有什么区别?
答案 0 :(得分:3)
Kotlin将始终优先于class成员函数。由于Test:call(Object)
是可能的匹配项,因此Kotlin选择该方法而不是您的扩展功能。
带有添加参数的扩展功能可以按您期望的方式解决,因为Test
类没有任何先例的成员函数(没有匹配的签名),因此选择了扩展方法。
以下是有关如何解析扩展功能的Kotlin文档的链接:https://kotlinlang.org/docs/reference/extensions.html#extensions-are-resolved-statically