簡體   English   中英

當從 Java 調用時,為什么我必須在 void kotlin 函數中返回 Unit.INSTANCE 而不是 NULL?

[英]Why do I have to return Unit.INSTANCE in a void kotlin function, when called from Java, and not NULL?

當有一個函數時,例如:

fun doSomething(action:() -> Unit) {
   action.invoke()
}

如果我從 Java 調用它,代碼需要是:

doSomething(() -> {
   //do something
   return Unit.INSTANCE
})

我已經看到代碼而不是使用

doSomething(() -> {
   //do something
   return null
})

它會影響發送null而不是Unit.INSTANCE嗎? Kotlin 是否通過驗證返回的 UNIT 實例來執行更多操作?

我認為大多數時候使用null還是Unit.INSTANCE並不重要。 但是,由於至少有 1 種情況不需要這樣的null ,因此您可能應該始終使用Unit.INSTANCE

一個不返回Unit.INSTANCE會導致問題的Unit.INSTANCE示例如下:

fun doSomething(action:() -> Unit) {
   action.invoke() logReturnTime("after action invocation")
}
infix fun Unit.logReturnTime(msg : String) { TODO("logging return time $msg") }

如果您調用它並返回null您將得到一個IllegalArgumentException ,而如果您使用Unit.INSTANCE ,代碼將毫無問題地運行。

話雖如此,我不認為這是一個很好的例子,但它清楚地表明,如果有人對該Unit ,那么它可能會失敗,所以你最好總是使用Unit.INSTANCE並且你是安全的,無論是什么接收器與您的功能有關。

Kotlin 中的任何方法都會返回一個值。 “作廢”方法總是返回類型的一個實例UnitUnit.INSTANCE 您可以在聲明中省略返回類型單元,但隱式添加它並在方法末尾返回值。 https://kotlinlang.org/docs/reference/basic-syntax.html

所以當從 Java 代碼調用 Kotlin 方法時,你需要填寫相同的契約並返回一些東西。 如果返回null則是對類型Unit的空引用。 僅僅因為它更好,為了避免空引用,萬一調用者想要對您的方法的結果進行操作,您應該避免返回null並返回Unit.INSTANCE 是的,這種情況不太可能發生,但會導致最煩人的錯誤。

暫無
暫無

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

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