gpt4 book ai didi

java - 无法从java调用kotlin扩展函数

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:06:34 25 4
gpt4 key购买 nike

我知道 kotlin 扩展函数被编译为静态函数,使用文件名作为带有 Kt 后缀的类名。问题是我的单个字符串参数函数在从 Java 代码调用时要求两个字符串参数。

扩展函数在KUtils文件中

fun String.extractDigits(strValue: String): String {
val str = strValue.trim { it <= ' ' }
var digits = ""
var chrs: Char
for (i in 0..str.length - 1) {
chrs = str[i]
if (Character.isDigit(chrs)) {
digits += chrs
}
}
return digits
}

调用java代码

KUtilsKt.extractDigits("99PI_12345.jpg")

编译时错误信息:

错误:(206, 42) 错误:KUtilsKt 类中的方法 extractDigits 不能应用于给定类型;
必填:字符串,字符串
找到:字符串
原因:实际和形式参数列表的长度不同

请帮忙
谢谢

最佳答案

问题是接收实例被编码为参数。所以:

fun String.extractDigits(strValue: String): String {...}

变成(javap 输出):

public static final java.lang.String extractDigits(java.lang.String, java.lang.String);

但是您只向函数传递了一个参数。

我不太明白你为什么在这里使用扩展函数,我希望看到使用接收实例而不是传递一个单独的值:

fun String.extractDigits(): String {
val str = this.trim { it <= ' ' } // Using `this`, i.e. the receiving instance
var digits = ""
var chrs: Char
for (i in 0..str.length - 1) {
chrs = str[i]
if (Character.isDigit(chrs)) {
digits += chrs
}
}
return digits
}

然后,在 Java 中,你可以像你尝试的那样调用它,在 Kotlin 中是这样的:

val str = "123blah4"
println(str.extractDigits()) // prints 1234

关于java - 无法从java调用kotlin扩展函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44745478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com