类型推断失败:没有足够的信息来推断参数 T Kotlin

Jac*_*lai 3 android kotlin

我正在使用密封类从网络返回数据。但是当我构建项目时,我收到以下错误

类型推断失败:没有足够的信息来推断参数 T in fun error(errorMessage: String, error: Throwable): State 请明确指定。

我在这里缺少什么?

这是代码

suspend fun getdataFromApi(context: Context?, token: String?): State<ScheduleReminderListResponse> =
    withContext(schedulerProvider.io)
    {

            try {
                val list = network.getScheduleReminderList(token).await()
                schedeleReminderListLocalDao.insertAll(list)
                return@withContext State.success(list)
            } catch (e: Exception) {
                return@withContext State.error( e.message ?: "Unknown Error",  e  )
            }


        }






sealed class State<T> {

class Loading<T>: State<T>()
data class Error<T>(val errorMessage: String?, val error: Throwable): State<T>()
data class Success<T>(var data: T) : State<T>()

companion object {
    fun <T> loading(): State<T> =
        Loading()

    fun <T> error(errorMessage: String, error: Throwable): State<T> =
        Error(errorMessage, error)

    fun <T> success(data: T): State<T> =
        Success(data)

   }
 }
Run Code Online (Sandbox Code Playgroud)

s1m*_*nw1 5

在这一行中State.error( e.message ?: "Unknown Error", e ),编译器不知道T应该是什么。如果将它与 进行比较success,您将看到您明确提供了一个参数,T编译器使用该参数来推断类型。您可以在调用错误时像这样指定它:

State.error<TYPE_OF_SCHEDULE_REMINDER_LIST>( e.message ?: "Unknown Error",  e  )
Run Code Online (Sandbox Code Playgroud)

由于您没有使用Tin Error,您可能需要考虑将其从密封类中完全删除,并仅在有意义的地方使用它。

sealed class State {

    object Loading : State()
    data class Error(val errorMessage: String?, val error: Throwable) : State()
    data class Success<T>(var data: T) : State()

    companion object {
        fun loading(): State = Loading

        fun error(errorMessage: String, error: Throwable): Error =
            Error(errorMessage, error)

        fun <T> success(data: T): Success<T> = Success(data)
    }
}
Run Code Online (Sandbox Code Playgroud)