【问题标题】:Extension functions issue扩展功能问题
【发布时间】:2018-12-28 13:40:06
【问题描述】:

在使用现有 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)
}
}

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

【问题讨论】:

    标签: kotlin kotlin-extension


    【解决方案1】:

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

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

    这里是关于如何解析扩展函数的 Kotlin 文档的链接:https://kotlinlang.org/docs/reference/extensions.html#extensions-are-resolved-statically

    【讨论】:

    • 好的,所以我在 java 中将“Object param”更改为“Test param”,在 Kotlin 中将“param: Any”更改为“param: Test”,它开始将 test.call{} 引用到我的扩展功能。但是 Test:call(Test) 也可能匹配。为什么行为会改变?
    • 您的扩展函数采用 Test.() -&gt; Unit 类型的 lambda,因此 Test:call(Test) 也不是可能的匹配项。
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2011-10-10
    • 2020-02-14
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多