【问题标题】:Unable to call kotlin extension function from java无法从 java 调用 kotlin 扩展函数
【发布时间】:2017-06-25 10:34:30
【问题描述】:

我知道 kotlin 扩展函数被编译为静态函数,使用 fileName 作为类名并带有 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 不能应用于给定类型;
必需:字符串,字符串
找到:字符串
原因:实际参数列表和形式参数列表的长度不同

请帮忙
谢谢

【问题讨论】:

    标签: java kotlin


    【解决方案1】:

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

    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 类中访问它。
    猜你喜欢
    • 2015-04-02
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多