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

How do I force a Java call to overloaded Kotlin method accepting a non-nulllable parameter?

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

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

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

我希望你清楚这里发生了什么。如果我可以为 属性 提供一个不可为 null 的默认值,那么 class 总是可以 return 为那个 属性 提供一个非空值,所以它 return直接s吧。如果我不能提供一个不可为 null 的默认值,那么 class return 是一个 Optional 因为它不能确定它可以传回一个非 null 对象。

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

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

我在这里遇到错误,因为 Java 调用了接受不可为 null 的默认值的方法,因此 return 是一个 Optional,我正在尝试分配那到 Boolean。但在这种情况下,我传递的默认值永远不会是 null,我想直接取回 Boolean

我知道 Java 可以调用另一个方法,因为这个有效:

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

我试过在 defaultIsDisabled 值上使用各种风格的 @Notnull/@Nonnull 注释来告诉 Java 它永远不可能是 null,但我做不到弄清楚如何让 Java 调用 return 裸 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 调用其中之一时,您会收到 "Ambiguous method call" 错误。