首页 > 解决方案 > 当返回通用类型 * 我得到错误信息不足以推断类型变量 T

问题描述

我有以下代码 -


// My function - 
suspend fun leaveGroup(isSoloGroup: Boolean, groupMemberEntity: GroupMemberEntity): Resource<*> {

        val snapShot = remoteDataSource.getSnapshot(GROUP_MEMBERS_COLLECTION) {
            whereEqualTo(Constants.DatabaseProperties.ID, groupMemberEntity.id)
        }

        if (snapShot is Resource.Exception) {
            return snapShot
        }

        val delete = remoteDataSource.deleteSnapshot(snapShot.data!!)
        if (delete is Resource.Exception) {
            return delete
        }

        if (isSoloGroup.not()) {
            return (Resource.Success()) // This is where the error occurs 
        }
        // Code continues ...
    }


//My resource class - 

sealed class Resource<T> {

    abstract val data: T?

    data class Success<T>(override val data: T? = null) : Resource<T>()

    data class Exception<T>(val throwable: Throwable, override val data: T? = null) : Resource<T>()

    data class Loading<T>(val hasStarted: Boolean = false, override val data: T? = null) : Resource<T>()

}

并且由于某种原因,当我返回类型时Resource<*>Resource. Success无法使用其默认值实例化该类null,我必须明确地给它一个空值 - 否则我会收到错误消息 Not enough information to infer type variable T。在构造函数中给它 null 显然是可行的,但这不是干净的代码,并且使默认值变得多余。我错过了什么?

标签: androidoopkotlin

解决方案


类型系统中有一个Nothing类型,它没有值,无法实例化。

因为 Nothing 没有值,Nothing?实际上是nullKotlin 中只捕获值的类型。

也就是说,当您声明这样的内容时:

val someVariable = null

someVariable 的推断类型是Nothing?

因此,如果您希望存储 null,则必须给它一个类型(编译器不能直接推断它,因为它可以是String?,Int?等),因此明确地给出它Nothing?更合适。

if (isSoloGroup.not()) {
    return Resource.Success<Nothing>()
}

推荐阅读