当前位置: 首页 > 面试题库 >

从Java访问Kotlin扩展功能

凌成天
2023-03-14
问题内容

是否可以从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互操作文件,并且在谷歌上搜索了很多,但是找不到。

我究竟做错了什么?这有可能吗?


问题答案:

默认情况下,文件中声明的所有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 */ }
}

从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);


 类似资料:
  • 我在Kotlin文件中定义了扩展函数。 其中是(生成的)java类。现在,我想用正常的java代码访问它: 然而,那是行不通的。IDE将无法识别方法,编译失败。

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

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

  • 主要内容:扩展函数,扩展函数是静态解析的,伴生对象的扩展,扩展的作用域,扩展声明为成员Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。 扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。 扩展函数 扩展函数可以在已有类中添加新的方法,不会对原类做修改,扩展函数定义形式: receiverType:表示函数的接收者,也就是函数扩展的对象 functionName:扩展函数的名称 params:扩展函数的参数,可以为NULL 以下实

  • Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。 扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。 扩展函数 扩展函数可以在已有类中添加新的方法,不会对原类做修改,扩展函数定义形式: fun receiverType.functionName(params){ body } receiverType:表示函数的接收者,也就是函数扩

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