gpt4 book ai didi

Kotlin 为什么尽管进行空检查仍需要非空断言

转载 作者:行者123 更新时间:2023-12-05 08:36:12 25 4
gpt4 key购买 nike

我正在尝试处理 Kotlin/Android 上的改造响应:

if (response.isSuccessful && response.body() != null) {
val result = response.body().result

首先,我不明白响应如何成功而正文为空。无论如何,如果我添加空检查,我也会得到“智能转换为‘xy’是不可能的,因为‘response.body()’是一个复杂的表达式”添加非空断言代码(!!)实际上对我来说这是两个单独的警告,但为什么是 null-Assertion 请求?

最佳答案

编译器无法知道 body() 每次都保证返回相同的东西,因此它无法将其智能转换为非空值。此外,如果 isSuccessful 为真,它不知道正文不会为空这一事实那么复杂。

因为我们从这个库的文档中知道它总是相同的,所以使用 !! 是安全的。但是您也可以将该值复制到局部变量并在您的空检查中使用该变量。这样即使您误解了文档,您也可以确定您的代码是安全的。

我自己并没有真正使用 Retrofit,但是通过一些阅读,我知道您可以在 Kotlin 中通过使用挂起函数更自然地使用它,然后您就不必使用回调了和响应对象。因此,不是创建一个返回 Call<MyData> 的函数,而是将调用排队,监听成功/失败,然后在成功时展开主体;相反,您可以将函数标记为 suspend 并直接返回 MyData。在进行函数调用时使用 try/catch 或 runCatching,因为它会在不成功时抛出。

关于Kotlin 为什么尽管进行空检查仍需要非空断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69790722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com