android - 在 Kotlin 中可空的 void 是什么意思?
问题描述
如果我在android studio中为retrofit2 enqueue调用生成回调代码,我会得到
object : Callback<Void?> {
override fun onResponse(call: Call<Void?>, response: Response<Void?>) {...}
...
}
我的 retrofit2 界面中的代码只是Void
@POST("api/v1/users")
fun post(@Body body: UserRequestData): Call<Void>
通常在 Kotlin 中?
只是意味着可以为空,这对其他类型很有意义。但是这种类型Void?
是什么,它与 just 有何不同Void
?
解决方案
来自 Java文档:
该类
Void
是一个不可实例化的占位符类,用于保存对Class
表示 Java 关键字 void 的对象的引用。
一般来说,在 Kotlinvoid
中被替换为:Unit
只有一个值的类型:
Unit
对象。此类型对应void
于 Java 中的类型。
但是,当Void
由于将其用作通用参数而需要使用时,请考虑以下事项:
Response<T>
有一个被调用的函数body()
,它返回一个泛型T
. 在你的情况下,Response<Void>.body()
它会返回null
。在 Java 中,这很好,因为Void
意味着“不相关”,所以null
是适当的响应。但是 Kotlin 具有安全性,因此有必要准确地表示这null
是可能Response<Void?>
的,即使它有点违反直觉。
如果库是纯 Kotlin 则更好的设计是Response<Nothing>
,当您调用时会产生错误body()
。