![](/img/trans.png)
[英]Why do I have to return Unit.INSTANCE when implementing in Java a Kotlin function that returns a Unit?
[英]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 中的任何方法都會返回一個值。 “作廢”方法總是返回類型的一個實例Unit
是Unit.INSTANCE
。 您可以在聲明中省略返回類型單元,但隱式添加它並在方法末尾返回值。 https://kotlinlang.org/docs/reference/basic-syntax.html
所以當從 Java 代碼調用 Kotlin 方法時,你需要填寫相同的契約並返回一些東西。 如果返回null
則是對類型Unit
的空引用。 僅僅因為它更好,為了避免空引用,萬一調用者想要對您的方法的結果進行操作,您應該避免返回null
並返回Unit.INSTANCE
。 是的,這種情況不太可能發生,但會導致最煩人的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.