在 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/