【问题标题】:What does nullable void mean in Kotlin?在 Kotlin 中可空的 void 是什么意思?
【发布时间】:2020-11-02 22:39:58
【问题描述】:

如果我在 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? 这种类型是什么?它与Void 有什么不同?

【问题讨论】:

标签: android rest android-studio kotlin retrofit2


【解决方案1】:

来自Javadocs

Void 类是一个不可实例化的占位符类,用于保存对表示 Java 关键字 void 的 Class 对象的引用。

一般来说,void 在 Kotlin 中被替换为 Unit。:

只有一个值的类型:Unit 对象。该类型对应Java中的void类型。

但是,当Void 被用作通用参数而需要使用时,请考虑以下事项:

Response&lt;T&gt; 有一个名为body() 的函数,它返回一个通用的T。在您的情况下,对于Response&lt;Void&gt;.body(),它将是return null。在 Java 中,这很好,因为 Void 表示“不相关”,所以 null 是一个适当的响应。但是 Kotlin 具有 null-safetly,因此要准确表示 null 是可能的,Response&lt;Void?&gt; 是必要的,尽管它有点违反直觉。

如果库是纯 Kotlin,更好的设计是 Response&lt;Nothing&gt;,当您调用 body() 时应该会产生错误。

【讨论】:

  • "一般来说,在 kotlin 中,Void 被替换为 Unit。"不,只有void 是。
  • “如果库是纯 Kotlin,更好的设计是 Response,当你调用 body() 时应该会产生错误。” Response&lt;Unit&gt; 会更好地对应。
猜你喜欢
  • 1970-01-01
  • 2017-12-03
  • 2013-03-09
  • 2012-03-11
  • 2020-05-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多