我正在使用密封类从网络返回数据。但是当我构建项目时,我会收到以下错误
类型推理失败:没有足够的信息来推断娱乐错误中的参数t(errormessage:string,错误:可投掷(:状态 请明确指定。
我在这里缺少什么?
这是代码
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)
}
}
在此行State.error( e.message ?: "Unknown Error", e )
中,编译器不知道T
应该是什么。如果将其与success
进行比较,您会发现您明确提供了T
的参数,该论点用于推断该类型。您可以在调用错误时这样指定它:
State.error<TYPE_OF_SCHEDULE_REMINDER_LIST>( e.message ?: "Unknown Error", e )
由于您不使用Error
中的T
,因此您可能要考虑将其完全从密封类中删除,而仅在有意义的情况下使用它。
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)
}
}
Error
数据类定义T
类型参数,但不以任何方式使用它。因此,当您创建Error
实例时,编译器无法推断出应使用的类型
要解决此问题,请更改State
和Error
的定义,以使它们没有类型的参数。
在 @s1m0nw1答案中,如果要将类型参数保留在State
模型中(因此返回值看起来很不错,并且类型为安全(,则可以考虑将T
标记为out
并在不使用它的子类中使用Nothing
sealed class State<out T> {
object Loading: State<Nothing>()
data class Error(val errorMessage: String?, val error: Throwable): State<Nothing>()
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)
}
}
这样,您的示例方法将保持与您不需要执行不安全铸件的NAD