Android GMS任务<;TResult>;类:如果isSuccessful(),getResult()能否返回null?

Android GMS任务<;TResult>;类:如果isSuccessful(),getResult()能否返回null?,android,kotlin,google-play-services,Android,Kotlin,Google Play Services,最近对GMS任务库进行了@Nullable更改。反编译的.class的前几行看起来像 public abstract class Task<TResult> { public Task() { } public abstract boolean isComplete(); public abstract boolean isSuccessful(); public abstract boolean isCanceled(); @

最近对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();
更新一些gms
play services zzz
依赖项后,代码现在出现编译错误:

LoginActivity.kt:(148,28):在AuthResult类型的可空接收器上只允许安全(?)或非空断言(!!)调用


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

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

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

见第1.2节“返回和暗示”

因此,对于合同,如果实现如下所示,它将正确地进行智能转换:

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

    fun isSuccessful(): Boolean {
        contract {
            returns(true) implies (result != null)
        }
        return result != null
    }
}
if (task.isSuccessful) {
        task.result?.user?.getIdToken(false)?.addOnCompleteListener { taskk ->
            this.emailIdTokenCompleteListener()(taskk)
        } ?: handleFailure() // Defensively call just in case
} else {
    handleFailure()
}
if (task.isSuccessful) {
        task.result?.user?.getIdToken(false)?.addOnCompleteListener { taskk ->
            this.emailIdTokenCompleteListener()(taskk)
        } ?: handleFailure() // Defensively call just in case
} else {
    handleFailure()
}