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

更改kotlin扩展函数接收器JVM名称

经骁
2023-03-14

这是一个一般性的问题。假设我有一个用kotlin编写的扩展函数,它将DP转换为PX,并返回一个非空Int

fun Int.toPx() {  /** implementation */ }

java中的函数如下所示

public int toPx(int $receiver) {  /** implementation */ }

在我看来,$receiver使Java-interop感到生成和不受欢迎。

共有1个答案

穆俊名
2023-03-14

@jvmname只能应用于函数、属性访问器和文件的顶级包外观。不支持参数名称。

基本上,您可以定义两个函数,一个使用简单参数,另一个使用接收器:

fun toPx(value: Int) { /* implementation */ }

fun Int.toPx() = toPx(this)

但是,可以预料的是,这将无法编译,因为这两个函数将具有相同的JVM签名。因此,为了消除它们的歧义,将@jvmname(“...”)添加到扩展中,并(可选地)将扩展标记为inline:

fun toPx(value: Int) { /* implementation */ }

@JvmName("toPxExtension") @Suppress("nothing_to_inline")
inline fun Int.toPx() = toPx(this)
 类似资料:
  • 上的编译器错误: 类型不匹配 必需:foo ?>

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

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

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

  • 问题内容: 假设从CGI开始,我已经将文件显示为文件。我想将的文件扩展名更改为显示文件。我该怎么做? 问题答案: , 例如:

  • 在针对PHPCMS V9做二次开发的时候,您可以自定义一些全局函数且不影响以后官方升级 您自定义的文件请放置于该文件中 phpcms\libs\functions\extention.func.php或者以.func.php格式命名,放置于如下目录中 phpcms\libs\functions\autoload