簡體   English   中英

如何強制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的默認值,則該類將返回Optional因為它無法確定它可以傳遞回非null對象。

這一切在Kotlin上都很好用,但是現在我想從Java調用非空版本。 我有這樣的事情:

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批注的各種defaultIsDisabled來告訴Java它永遠不能為null ,但是我不知道如何讓Java調用返回裸機的方法版本Boolean

誰能告訴我如何讓Java調用此方法的版本,該版本接受非空的默認值,同時通過變量提供該值?

非空Boolean boolean在Java中只是boolean 要調用非null重載,只需使用強制轉換:

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

這只行得通,因為Kotlin優化了第二種方法以接受boolean而不是Boolean ,因此這兩種方法的簽名在生成的字節碼中是不同的。 如果等效方法接受String參數,則無法從Java調用這兩種方法。 Kotlin創建兩個具有相同簽名的方法,並且當您嘗試從Java調用其中一個時,會出現“模棱兩可的方法調用”錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM