【发布时间】:2018-08-08 03:29:52
【问题描述】:
动机:
在我们的 Android 项目中,我们有很多验证,例如 str != null && !str.isEmpty(),所以我决定将它们重构为辅助方法。
我暂时使用以下类作为助手:
public class StringUtil {
public static boolean isNullOrEmpty(@Nullable String str) {
return str == null || str.isEmpty();
}
}
问题:
我们已经有了一个字符串的帮助类,用 Kotlin 编写(比如 String.kt)。 所以,这并不清楚是否有两个助手(一个在 Java 中,一个在 Kotlin 中)。
我尝试了什么:
在 String.kt 中复制过去 isNullOrEmpty() 的幼稚方法没有成功,因为 $reciever 为空,所以它崩溃了。
其次,我尝试使用来自kotlin.text(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/is-null-or-empty.html)的Kotlin原生isNullOrEmpty():
public inline fun CharSequence?.isNullOrEmpty(): Boolean
但我不知道如何从 Java 中调用它。此页面 (https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html) 不提供任何建议。
问题不在于 Accessing Kotlin extension functions from Java。我的扩展非常明显,但由于空接收器而崩溃。正如我在下面提到的,问题更多是关于访问本机库代码,而不是我自己的扩展。
有什么帮助吗?
【问题讨论】:
-
@Moira 我的问题是关于访问本机库代码,而不是我自己的扩展,请在将其标记为重复之前仔细阅读问题。
-
您能否澄清一下“$receiver 为空,所以它崩溃了”的确切含义?如果您为可空接收器类型 (
String?.isNullOrEmpty) 声明扩展函数,则可以将 null 作为 $receiver 参数传递给它们。 -
嗯,这不是本机代码,它是标准库,它是关于扩展函数的(这是否是您的代码无关紧要)。在大多数情况下,这是重复的。 yole 指出,由于
@InlineOnly将编译后的函数标记为synthetic,Java 无法访问一些 stdlib 函数。