Kotlin 扩展功能问题

Kotlin 扩展功能问题,kotlin,kotlin-extension,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) { } } 科特林试验 fun Test.call(toApp

在现有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) {
}
}
科特林试验

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)
}
}
fun Test.call(toApply:Test.)->Unit:Test{
回电
.应用(toApply)
}
有趣的测试。调用(参数:Any,toApply:Test.(->单元):Test{
回电(参数)
.应用(toApply)
}
趣味主线(args:Array){
val测试=测试()
//指java方法;未解析的引用:configure1;未解析的引用:configure2
测试呼叫{
配置1()
配置2(正确)
}
//指的是我的扩展功能,工作正常
test.call(测试){
配置1()
配置2(正确)
}
}

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

Kotlin始终优先于类成员函数。因为
Test:call(Object)
是一个可能的匹配,所以Kotlin选择该方法而不是您的扩展函数

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


以下是关于如何解析扩展函数的Kotlin文档链接:

Kotlin将始终优先于类成员函数。因为
Test:call(Object)
是一个可能的匹配,所以Kotlin选择该方法而不是您的扩展函数

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


这里有一个到Kotlin文档的链接,说明如何解析扩展函数:

Ok,所以我在java中将“Object param”改为“Test param”,在Kotlin中将“param:Any”改为“param:Test”,并且它开始引用Test.call{}来调用我的扩展函数。但是Test:call(Test)也可能匹配。为什么行为发生了变化?您的扩展函数采用类型为
Test的lambda。(->Unit
,因此
Test:call(Test)
也不可能匹配。好的,所以我在java中将“Object param”改为“Test param”,在Kotlin中将“param:Any”改为“param:Test”,并且它开始引用Test。调用{}到我的扩展函数。但是Test:call(Test)也可能匹配。为什么行为发生了变化?您的扩展函数接受类型为
Test的lambda。(->Unit
,因此
Test:call(Test)
也不可能匹配。