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

如何从Java调用静态编程语言标准库函数?

田焕
2023-03-14

动机:

在我们的Android项目中,我们有许多验证,比如str!=无效的

public class StringUtil {
    public static boolean isNullOrEmpty(@Nullable String str) {
        return str == null || str.isEmpty();
    }
}

问题:

我们已经有一个字符串的助手类,用静态编程语言编写(比如,String.kt)。所以,有两个助手(一个在Java,一个在静态编程语言)是不清楚的。

我尝试的是:

在字符串中复制过去的isNullOrEmpty()的简单方法。kt未成功,因为$receiver为空,所以它崩溃。

其次,我尝试使用Kotlin的nativeisNullOrEmpty()。正文(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/is-null-or-empty.html):

public inline fun CharSequence?.isNullOrEmpty(): Boolean

但我不知道如何从Java调用它。本页(https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html)不要提供任何建议。

问题不在于从Java访问Kotlin扩展函数。我的扩展是完全可见的,但它崩溃了,因为空接收器。正如我在下面提到的,问题更多的是关于访问本机库代码,而不是我自己的扩展。

需要帮忙吗?


共有2个答案

谷森
2023-03-14

根据@yole的建议,我终于成功地将代码正确地转换为扩展名:

fun String?.isNullOrEmpty(): Boolean = (this == null || this.isEmpty())

所以,问题在于将扩展定义为String,而不是String 导致$receiver崩溃。(Kotlin在转换为Java时生成隐藏的非空验证,请参见https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#null-(安全性)

或者,可以通过自定义扩展从Java访问标有@InlineOnly的标准库函数。

fun String?.isVoid(): Boolean = this.isNullOrEmpty()

我这里的问题是对的误解 。我先试了一下:

fun String?.isVoid(): Boolean? = this?.isNullOrEmpty()

正如@Moria所提到的,请注意的行为 -b?。方法将返回b。如果b不为null,则返回方法,否则返回null(https://kotlinlang.org/docs/reference/null-safety.html#safe-(电话)

贺博厚
2023-03-14

一些标准库函数,包括这个函数,都用@InlineOnly注释标记,这使得Java无法访问它们。对于大多数其他函数,您可以完全按照链接为副本的问题中所述访问它们。

 类似资料:
  • 有可能从Java代码中访问扩展函数吗? 我在静态编程语言文件中定义了扩展函数。 其中MyModel是(生成的)java类。现在,我想在我的普通java代码中访问它: 然而,那是行不通的。IDE无法识别bar()方法,编译失败。 work使用kotlin的静态函数: 通过使用导入com.test.extensions.ExtensionsPackage我的IDE似乎配置正确。 我从kotlin文档中

  • 我在kotlin文件中定义了这个函数。 想这样从Java调用它 随着 但它给了我 我意识到lambda函数的参数似乎是< code >列表 如果我把类转换成java,我可以很容易地用lambda回调函数调用那个函数。 我做错了什么

  • 我想为我的游戏创建一个简单的倒计时,当游戏开始时,我想每秒调用这个函数: 我试过这个: 但应用程序不幸停止,第二次调用run函数 3周前,我刚刚开始使用android开发和静态编程语言,到目前为止,我对它了解最多。 在Xcode中使用swift时,我使用了这一行,我认为类似的东西也适用于Kotlin

  • 我正在尝试从我的Java类中调用此柯特林挂起代码。该解决方案基于此处提到的内容。https://stackoverflow.com/a/52887677/5140533 科特林代码: 当我从我的Java类调用时,我看不到任何print语句。有人能解释一下到底发生了什么以及我如何纠正这一点吗?

  • 我想从静态编程语言代码调用外部命令。 在C/Perl中,我将使用函数 在Python中,我将使用子流程模块 在Go中,我将使用os/exec等 但是在科特林我该怎么做呢?

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?