gpt4 book ai didi

android - GMS 任务 类 : can getResult() return null if isSuccessful()?

转载 作者:行者123 更新时间:2023-11-29 23:27:33 27 4
gpt4 key购买 nike

最近对 GMS 任务库进行了 @Nullable 更改。前几行反编译的 .class 看起来像

public abstract class Task<TResult> {
public Task() {
}

public abstract boolean isComplete();

public abstract boolean isSuccessful();

public abstract boolean isCanceled();

@Nullable
public abstract TResult getResult();

之前编译的 Kotlin 代码:

        if (task.isSuccessful) {
task.result.user?.getIdToken(false)?.addOnCompleteListener { taskk ->
this.emailIdTokenCompleteListener()(taskk)
}

更新一些 gms play-services-zzz 依赖项后,代码现在有编译错误:

LoginActivity.kt: (148, 28): Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type AuthResult?

问题是,isSuccessful() == true 是否意味着 getResult != null?或者将 if 测试更改为 if (task.result != null) 会更好吗?

最佳答案

您看到的是 Kotlin 编译器无法根据 isSuccessful 的结果将结果智能转换为 NonNull 类型,这可能在与 Java 和 Kotlin 代码交互时发生。

在 Kotlin 1.3 中,“契约”的实现被添加到语言中,以允许开发人员以 IDE 可用于静态分析和推断类型(智能转换)的格式添加关于方法的元数据。

请参阅第 1.2 节“返回和暗示”https://proandroiddev.com/kotlin-contracts-make-great-deals-with-the-compiler-f524e57f11c

因此对于合约,如果实现看起来像这样,它将正确地进行智能转换:

open class Task<T> {
var result: T? = null
private set

fun isSuccessful(): Boolean {
contract {
returns(true) implies (result != null)
}
return result != null
}
}

然而,在您的情况下,您可能想使用另一个安全调用运算符(operator) ?并调用您的 !task.isSuccessful使用 Elvis 运算符的代码 ?:像这样:

if (task.isSuccessful) {
task.result?.user?.getIdToken(false)?.addOnCompleteListener { taskk ->
this.emailIdTokenCompleteListener()(taskk)
} ?: handleFailure() // Defensively call just in case
} else {
handleFailure()
}

关于android - GMS 任务 <TResult> 类 : can getResult() return null if isSuccessful()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53290241/

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