首页 > 解决方案 > 在 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

标签: androidrestandroid-studiokotlinretrofit2

解决方案


来自 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()


推荐阅读