java - 如何强制 Java 调用接受不可为空参数的重载 Kotlin 方法?

标签 java kotlin overloading nullable overload-resolution

在 Kotlin 中,我在一个对象上定义了两个重载方法。它们具有相同的签名,只不过在一种情况下,参数可以为空,而在另一种情况下,相同的参数则不能为空。根据传入的参数是否可为空,选择一个重载而不是另一个重载:

fun getBooleanPropertyValue(key: String, dflt: Boolean? = null) : Optional<Boolean> {
}

fun getBooleanPropertyValue(key: String, dflt: Boolean) : Boolean {
}

我希望大家清楚这里发生了什么。如果我可以为属性提供不可为 null 的默认值,则该类始终可以为该属性返回非 null 值,因此它会直接返回它。如果我无法提供不可为 null 的默认值,则该类将返回一个 Optional,因为它无法确定它是否可以传回一个非 null 对象。

这一切在 Kotlin 中都运行良好,但现在我想从 Java 调用不可为 null 的版本。我有这样的东西:

static final Boolean defaultIsDisabled = false;
Boolean isDisabled = propSource.getBooleanPropertyValue("isDisabled", defaultIsDisabled);

我在这里收到一个错误,因为 Java 调用接受不可空默认值的方法,因此返回一个 Optional,并且我尝试将其分配给 Boolean。但在这种情况下,我传递的默认值永远不能为 null,并且我想直接返回 Boolean

我知道 Java 可以调用其他方法,因为这有效:

Boolean isDisabled = propSource.getBooleanPropertyValue("isDisabled", false);

我尝试在 defaultIsDisabled 值上使用各种类型的 @Notnull/@Nonnull 注释来告诉 Java 它永远不能为 null,但我不知道如何让 Java 调用返回裸 Boolean 的方法版本。

谁能告诉我如何让 Java 调用此方法的版本,该版本接受不可为空的默认值,同时通过变量提供该值?

最佳答案

不可为 null 的 Boolean 只是 Java 中的 boolean。要调用非空重载,只需使用强制转换:

static final Boolean defaultIsDisabled = false;
boolean isDisabled = propSource.getBooleanPropertyValue("isDisabled", (boolean) defaultIsDisabled);

这之所以有效,是因为 Kotlin 优化了第二个方法来接受 boolean 而不是 Boolean,因此这两个方法的签名在生成的字节码中是不同的。对于接受 String 参数的等效方法,无法从 Java 调用这两个方法中的任何一个。 Kotlin 创建两个具有相同签名的方法,当您尝试从 Java 调用其中之一时,您会收到“不明确的方法调用”错误。

关于java - 如何强制 Java 调用接受不可为空参数的重载 Kotlin 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55893584/

相关文章:

Kotlin:如何检查数字是否有小数点(模数解决方案不起作用)

android - 使用 Kotlin 协程时 Room dao 类出错

php - 魔法函数 __call 函数不起作用

ocaml - Ocaml中的重载

java - 如何将屏幕捕获为图像,将其绘制在 GUI 的组件上并在某些区域绘制框?

java - 在Centos 7上安装Sqoop 1.99.7

android - 在 EditText Kotlin 中设置文本

c++ - 在c++中操作重载赋值运算符

java - 在 Java Play 中解析 JSON

java - 使用来自 java 的 HANA PLACEHOLDER 查询和命名参数替换