java - 从 Java 访问 Kotlin 扩展函数

标签 java kotlin extension-function

是否可以从 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/

相关文章:

java - 什么时候在方法右括号后加分号?

Java toTitleCase 函数

java - 如何使用 Java 更有效地反转数字

kotlin - Kotlin 是 "pass-by-value"还是 "pass-by-reference"?

android studio org.json.JSON.typeMismatch

android - 如何在类上使用 Kotlin 扩展函数?

java - JavaSound API Sequencer接口(interface)

android - 带有 Android Studio 的 Protobuf

kotlin - 通用接口(interface)的扩展函数

android - 如何在 Kotlin 中创建具有多个接收器的扩展函数?