我知道kotlin扩展函数是作为静态函数编译的,使用fileName作为类名,后缀为Kt.问题是我的单个String参数函数在从java代码调用时要求两个String参数.
扩展函数在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
}
Run Code Online (Sandbox Code Playgroud)
调用java代码
KUtilsKt.extractDigits("99PI_12345.jpg")
Run Code Online (Sandbox Code Playgroud)
编译时错误消息:
错误:(206,42)错误:类KUtilsKt中的方法extractDigits不能应用于给定类型;
required:String,String
found:字符串
原因:实际和正式参数列表的长度不同
请帮助
谢谢
问题是接收实例被编码为参数.所以:
fun String.extractDigits(strValue: String): String {...}
Run Code Online (Sandbox Code Playgroud)
成为(javap输出):
public static final java.lang.String extractDigits(java.lang.String, java.lang.String);
Run Code Online (Sandbox Code Playgroud)
但是你只向函数传递了一个参数.
我不太明白为什么你在这里使用扩展函数,我希望看到使用接收实例而不是传递一个单独的值:
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
}
Run Code Online (Sandbox Code Playgroud)
然后,在Java中,你可以像你尝试的那样调用它,在Kotlin中就像这样:
val str = "123blah4"
println(str.extractDigits()) // prints 1234
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
685 次 |
| 最近记录: |