当前位置: 首页 > 知识库问答 >
问题:

从Java访问Kotlin扩展函数

冀弘济
2023-03-14

我在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()方法,编译失败。

public fun bar(): Int {
   return 2*2
}

共有1个答案

宗鸿博
2023-03-14

默认情况下,文件中声明的所有Kotlin函数都将编译为同一包中类中的静态方法,并且使用源自Kotlin源文件的名称(第一个字母大写,扩展名“.kt”替换为“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 */ }
}
import com.test.extensions.ExampleKt;

MyModel model = new MyModel();
ExampleKt.bar(model);
import static com.test.extensions.ExampleKt.*;

MyModel model = new MyModel();
bar(model);
 类似资料:
  • 问题内容: 是否可以从Java代码访问扩展功能? 我在Kotlin文件中定义了扩展功能。 (生成的)java类在哪里。现在,我想用普通的Java代码访问它: 但是,这不起作用。 IDE无法识别该方法,并且编译失败。 起作用的是与kotlin的静态函数一起使用: 通过使用我的IDE似乎已正确配置。 我从kotlin文档中搜索了整个Java互操作文件,并且在谷歌上搜索了很多,但是找不到。 我究竟做错了

  • 我想在使用Kotlin扩展函数时访问Java的私有字段。 假设我有一个Java类。ABC只有一个私有字段。我想用静态编程语言编写一个扩展函数,无论出于什么原因使用该字段。 Kotlin的功能是: 我得到的错误是: 无法访问“mPrivateField”:它在“ABC”中是专用的 有没有办法绕过这个限制?

  • 我在Kotlin编程,我有日期类的扩展功能。 它在< code>onCreate中工作正常,但是在< code >异步任务中的< code>doInBackground中出现错误 我里面有这些线 < code > getCurrentDateTime()返回< code>Date类的实例,并且为< code>toString()中的参数给出了错误 也可以参数为公共开放的乐趣toString():字

  • 静态编程语言全局函数: 用java调用此函数: 它会给出以下错误:无法解析方法'show WarningDialog(com.us.stickermaker.backgroundRemover.##################################################################################################### 该

  • 有可能从Java代码中访问扩展函数吗? 我在静态编程语言文件中定义了扩展函数。 其中MyModel是(生成的)java类。现在,我想在我的普通java代码中访问它: 然而,那是行不通的。IDE无法识别bar()方法,编译失败。 work使用kotlin的静态函数: 通过使用导入com.test.extensions.ExtensionsPackage我的IDE似乎配置正确。 我从kotlin文档中

  • 我正在开发一个chrome扩展,遇到了一个大问题。 奇怪的是,我可以访问iframe的html。因此,这段代码在chrome扩展中可以完美地工作: 我尝试将“all_frames”:true放入清单文件中,但没有成功:(