是否可以从 Java 代码访问扩展函数?
我在 Kotlin 文件中定义了扩展函数。
package com.test.extensions
import com.test.model.MyModel
/**
*
*/
public fun MyModel.bar(): Int {
return this.name.length()
}
MyModel
是一个(生成的)java 类。
现在,我想在我的普通 java 代码中访问它:
MyModel model = new MyModel();
model.bar();
但是,这不起作用。 IDE 无法识别 bar()
方法,编译失败。
使用来自 kotlin 的静态函数起作用的是:
public fun bar(): Int {
return 2*2
}
通过使用 import com.test.extensions.ExtensionsPackage
所以我的 IDE 似乎配置正确。
我从 kotlin 文档中搜索了整个 Java-interop 文件,也搜索了很多,但我找不到。
我做错了什么?这甚至可能吗?
最佳答案
默认情况下,文件中声明的所有 Kotlin 函数都将编译为同一包内的类中的静态方法,并使用从 Kotlin 源文件派生的名称(首字母大写和 ".kt"</em > 扩展名替换为 "Kt" 后缀)。为扩展函数生成的方法将有一个附加的第一个参数,带有扩展函数接收器类型。
将其应用于原始问题,Java 编译器将看到名为 example.kt
的 Kotlin 源文件package com.test.extensions
public fun MyModel.bar(): Int { /* actual code */ }
好像声明了以下 Java 类
package com.test.extensions
class ExampleKt {
public static int bar(MyModel receiver) { /* actual code */ }
}
从 Java 的角度来看,扩展类不会发生任何事情,因此您不能只使用点语法来访问此类方法。但是它们仍然可以作为普通的 Java 静态方法调用:
import com.test.extensions.ExampleKt;
MyModel model = new MyModel();
ExampleKt.bar(model);
ExampleKt 类可以使用静态导入:
import static com.test.extensions.ExampleKt.*;
MyModel model = new MyModel();
bar(model);
关于java - 从 Java 访问 Kotlin 扩展函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28294509/